通用winphone authentication_ui_failed with ADAL

kil*_*erd 5 azure adal win-universal-app

所以这整个adal事情是一个巨大的痛苦才能正常工作......每当我尝试使用其中一个身份提供程序(通过ADAL安装并由azure AD后端提供)登录时,windows phone会抛出"authentication_ui_failed"异常.

我一直在四处寻找和谷歌搜索几天,但一直没有找到任何有用的东西.我正在使用ADAL的预发布版本可能没有帮助...

无论如何,这是发生的事情:

  1. 点击登录(开始流程)
  2. Windows Phone停止显示当前应用程序(屏幕变黑并加载一段时间)
  3. 将出现一个新屏幕,其中包含安装在后端的身份提供程序(Facebook,Google +,...)
  4. 点击Facebook或谷歌或其他什么,它会带你到相关的登录页面
  5. 输入凭据并按登录
  6. 当设备尝试返回应用程序时,屏幕再次变黑
  7. "恢复"在屏幕上显示一瞬间
  8. 抛出异常

例外是:

authentication_ui_failed:基于浏览器的身份验证对话框无法完成.

内在异常:

System.IO.FileNotFoundException: The specified protocol is unknown. (Exception from HRESULT: 0x800C000D)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory.WebUI.<AcquireAuthorizationAsync>d__0.MoveNext() 
Run Code Online (Sandbox Code Playgroud)

和stacktrace:

at Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory.WebUI.<AcquireAuthorizationAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory.AcquireTokenInteractiveHandler.<AcquireAuthorizationAsync>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory.AcquireTokenInteractiveHandler.<PreTokenRequest>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.<RunAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.<AcquireTokenCommonAsync>d__4e.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.<AcquireTokenAsync>d__47.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at ThreeAndMore.Mobile.Services.NetworkManager.<Login>d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at ThreeAndMore.Mobile.Windows.MainPage.<Login>d__1.MoveNext()
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码

        public async Task<AuthenticationResult> Login(IPlatformParameters parameters, bool isSignIn)
    {
        var authContext = new AuthenticationContext(AUTHORITY_URL, new TokenCache());

        if (CORRELATION_ID != null &&
                CORRELATION_ID.Trim().Length != 0)
        {
            authContext.CorrelationId = Guid.Parse(CORRELATION_ID);
        }

        String policy = "";
        if (isSignIn)
            policy = EMAIL_SIGNIN_POLICY;
        else
            policy = EMAIL_SIGNUP_POLICY;

        return await authContext.AcquireTokenAsync(SCOPES, ADDITIONAL_SCOPES, CLIENT_ID, new Uri(REDIRECT_URL), parameters, UserIdentifier.AnyUser, EXTRA_QP, policy);            
    }
}
Run Code Online (Sandbox Code Playgroud)

它被调用如下:

        private async void Login()
    {
        try
        {
            NetworkManager mngr = NetworkManager.GetInstance();
            AuthenticationResult result = await mngr.Login(new PlatformParameters(PromptBehavior.Auto, false), true);
            MessageDialog msgbox = new MessageDialog("welcome " + result.UserInfo.Name + "User:" + result.UserInfo.DisplayableId);
            await msgbox.ShowAsync();

        }
        catch (Exception e)
        {
            MessageDialog msgbox = new MessageDialog(String.Format("LOGIN EXCEPTION: {0} with hresult: {1} and inner exception {2} and stacktrace: {3}", e.Message, e.HResult, e.InnerException, e.StackTrace));
            await msgbox.ShowAsync();
            System.Diagnostics.Debug.WriteLine(String.Format("LOGIN EXCEPTION: {0} with hresult: {1} and inner exception {2} and stacktrace: {3}", e.Message, e.HResult, e.InnerException, e.StackTrace));
        }

    }
Run Code Online (Sandbox Code Playgroud)

令我感到奇怪的一件事是它是一个"FileNotFoundException"它应该能找到什么文件?这是webrequest而不是文件阅读请求?

即使在搜索了2天之后,我还没有找到一个有希望的解决方案.我不知道还有什么可做/尝试.