我正在使用 MSAL.NET 在我的 .NET MAUI 应用程序中实施 Azure AD B2C 身份验证。我的 .NET MAUI 应用程序面向 .NET 8,我正在使用
Microsoft.Identity.Client.Extensions.Msal
版本 4.66.0
。
我的应用程序使用
AppShell
,启动后,它会调用我的 InitializeAsync()
的 StartupPage.cs
方法。我在 InitializeAsync()
中做的第一件事是拨打以下电话:
var authenticatedUser = await _authService.IsAuthenticated();
。这个方法看起来像这样:
public async Task<User> IsAuthenticated()
{
await PublicClientSingleton.Instance.AcquireTokenSilentAsync();
var claims = PublicClientSingleton.Instance.MSALClientHelper.AuthResult.ClaimsPrincipal.Claims; // This throws that error!
...
}
这就是抛出
System.InvalidOperation
异常并附带消息的地方:
System.InvalidOperationException:在 Android 上,您必须指定 将使用以下方式显示浏览器弹出窗口的当前活动 WithParentActivityOrWindow 方法。
顺便说一句,这就是我的
MainActivity.cs
文件在 Android
文件夹中的 Platforms
下的样子:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// configure platform specific params
PlatformConfig.Instance.RedirectUri = $"msal{PublicClientSingleton.Instance.MSALClientHelper.AzureADB2CConfig.ClientId}://auth";
PlatformConfig.Instance.ParentWindow = this;
// Initialize MSAL and platformConfig is set
_ = Task.Run(async () => await PublicClientSingleton.Instance.MSALClientHelper.InitializePublicClientAppAsync()).Result;
}
关于如何解决这个问题有什么建议吗?
我用于在 .NET MAUI 应用程序中实现 MSAL.NET 的代码来自此 Microsoft 存储库:https://github.com/Azure-Samples/ms-identity-dotnetcore-maui
有人已经在这里发布了答案:https://github.com/SyncfusionExamples/Authenticate-.NET-MAUI-App-with-Azure-AD/issues/1#issuecomment-1576183450
看起来需要进行一些小修改才能在 Android 上运行。我在
InitializePublicClientAppAsync()
中的MSALClientHelper
方法中添加了以下条件方法调用:
public async Task<IAccount> InitializePublicClientAppAsync()
{
// Initialize the MSAL library by building a public client application
this.PublicClientApplication = this.PublicClientApplicationBuilder
.WithRedirectUri($"msal{PublicClientSingleton.Instance.MSALClientHelper.AzureADB2CConfig.ClientId}://auth")
#if ANDROID
.WithParentActivityOrWindow(() => Platform.CurrentActivity) // This is needed for Android
#endif
.Build();
await AttachTokenCache();
return await FetchSignedInUserFromCache().ConfigureAwait(false);
}