Xamarin Forms 中的 MSAL 和缓存访问令牌

MSAL and Caching accesstoken on Xamarin Forms

我们有一个 Xamarin Forms 代码库,自 2019 年 1.1.4 以来一直使用 MSAL,我们现在使用 4.22.0。

该应用程序始终保留它自己的以静默方式或交互方式获取的访问令牌的副本,并且它是它在访问各种 B2C 安全 API 时使用的应用程序副本。

它仅在初始登录或检测到 401 时调用 AcquireTokenSilentAcquireTokenInteractive

我们认为令牌的存储存在问题,据我所知,MSAl 无论如何都会缓存访问令牌本身。查看文档和示例,我们应该在需要令牌时调用 AcquireTokenSilent 并处理 MSALUIRequiredException 以调用 AcquireTokenInteractive。

这是否正确,MSAL 是否缓存访问令牌?

当我们构建 PublicClientApplication 时,我们当前不调用 WithIosKeychainSecurityGroup。这是令牌缓存在 iOS 上工作的先决条件吗?

PublicClientApplicationBuilder
                        .Create(ClinicalServicesSettings.ClientID)
                        .WithB2CAuthority(ClinicalServicesSettings.Authority)
                        .Build()

您应该使用推荐的 AcquireTokenSilent 调用模式,捕获 MsalUiRequiredException 并调用 AcquireTokenInteractive。

MSAL 会在移动应用程序中为您处理缓存。在 AcquireTokenSilent 期间,MSAL 将检查缓存以查看是否存在有效帐户以及用户是否可以静默登录而不显示 UI。如果刷新令牌已过期,或者已将条件访问策略应用于帐户(如 MFA),则将抛出 MsalUiRequiredException。

如果你想在 iOS 上属于同一个 TeamId 的应用程序之间共享令牌,你需要使用 WithIosKeychainSecurityGroup,它设置了 iOS 密钥链安全组。 TeamId 附加到安全组,默认情况下使用安全组 com.microsoft.adalcache,这是 MSAL 在身份验证后缓存令牌的位置(无论它是在应用程序中发生还是通过身份验证器发生 - 但是通过身份验证器进行身份验证不是可用于 B2C)。这使得令牌可以在应用之间共享,并与 ADAL 和 MSAL iOS 个应用共享。