MSAL和Xamarin表单上的缓存访问



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

应用程序始终保留其自己的副本,无论是以静默方式还是以交互方式获得的accesstoken,并且在访问各种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应用程序共享。