在Android上,您必须使用WithParentActivityOrWindow方法指定将显示浏览器弹出窗口的当前Activity

问题描述 投票:0回答:1

我正在使用 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;
}

关于如何解决这个问题有什么建议吗?

android maui azure-ad-msal
1个回答
0
投票

我用于在 .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);
}
© www.soinside.com 2019 - 2024. All rights reserved.