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

时间:2017-03-21 21:01:51

标签: c# azure xamarin.ios xamarin.forms azure-ad-b2c

我创建了一个Xamarin.Forms应用,它使用MSAL对Azure B2C目录中的用户进行身份验证。我已经设置了以下示例中的所有内容:

https://developer.xamarin.com/guides/xamarin-forms/cloud-services/authentication/azure-ad-b2c/

我在PlatformParametersMainActivity中都指定了AppDelegate。然后在我的HomePage我调用AquireTokenAsync()方法,如下所示:

AuthenticationResult ar = await App.AuthenticationClient.AcquireTokenAsync(Config.Scopes, string.Empty, 
                                UiOptions.SelectAccount, string.Empty, null,
                                Config.Authority, Config.SignUpSignInpolicy);

此代码在Android中正常运行,并正确显示我的用户能够成功登录的WebView

然而,当我在iPhone模拟器(iPhone 7 Plus - iOS 10.2)上执行此代码时,应用程序崩溃并抛出MsalException并显示以下消息:

authentication_ui_failed: The browser based authentication dialog failed to complete

以下是堆栈跟踪的其余部分:

Authority: https://login.microsoftonline.com/<myAuthority>/
    Scope: <myClientId>
    ClientId: <MyClientId>
    CacheType: null
3/21/2017 8:41:10 PM: - WebUI.cs: System.NullReferenceException: Object reference not set to an instance of an object
 at Microsoft.Identity.Client.WebUI.Authenticate (System.Uri authorizationUri, System.Uri redirectUri, System.Collections.Generic.IDictionary`2[TKey,TValue] additionalHeaders, Microsoft.Identity.Client.Internal.CallState callState) [0x00029]
Mar 21 15:41:10 3/21/2017 8:41:10 PM: - AcquireTokenHandlerBase.cs: Microsoft.Identity.Client.MsalException: authentication_ui_failed: The browser based authentication dialog failed to complete ---> System.NullReferenceException: Object reference not set to an instance of an object
 at Microsoft.Identity.Client.WebUI.Authenticate (System.Uri authorizationUri, System.Uri redirectUri, System.Collections.Generic.IDictionary`2[TKey,TValue] additionalHeaders, Microsoft.Identity.Client.Internal.CallState callState) [0x00029]

我发现了另一个类似的问题here,它说我需要为我的应用程序添加一些功能,但我无法找到如何为Xamarin.iOS应用程序执行此操作。

1 个答案:

答案 0 :(得分:3)

我终于弄明白了我的愚蠢错误,但万一其他人遇到同样的问题,这是什么让我痛苦:

我在我的页面的构造函数中调用AquireTokenAsync()方法,所以它还没有完成加载。显然,对于Android来说这不是一个问题,但是为了在iOS中弹出网页,页面需要已经加载。我将AquireTokenAsync电话移至我的OnAppearing()方法,现在可以正常使用了!