配置密钥链

如果适用于 iOS 和 macOS 的 Microsoft 身份验证库 (MSAL) 要将用户登录或刷新令牌,它会尝试在密钥链中缓存令牌。 通过在密钥链中缓存令牌,MSAL 可以在同一家 Apple 开发商分发的多个应用之间提供静默单一登录 (SSO)。 SSO 是通过密钥链访问组功能实现的。 有关详细信息,请参阅 Apple 的密钥链项文档

本文介绍如何配置应用权利,使 MSAL 能够将缓存的令牌写入 iOS 和 macOS 密钥链。

默认的密钥链访问组

iOS

iOS 上的 MSAL 默认使用 com.microsoft.adalcache 访问组。 这确保了多种应用之间具有来自同一发布者的的最佳 SSO 体验。

在 iOS 上,请在 XCode 中的“项目设置”>“功能”>“密钥链共享”下,将 com.microsoft.adalcache 密钥链组添加到应用的权利中。

macOS

macOS 上的 MSAL 默认使用 com.microsoft.identity.universalstorage 访问组。

由于 macOS 密钥链的限制,在 macOS 10.14 和更低版本上,MSAL 的 access group 不会直接转换为密钥链访问组属性(请参阅 kSecAttrAccessGroup)。 但是,从 SSO 的角度讲,MSAL 的行为类似,可确保同一家 Apple 开发商分发的多个应用程序提供静默 SSO。

在 macOS 10.15 和更高版本 (macOS Catalina) 中,与 iOS 类似,MSAL 使用密钥链访问组属性来实现静默 SSO。

自定义的密钥链访问组

若要使用不同的密钥链访问组,可以在创建 MSALPublicClientApplicationConfig 时传递自定义组,然后再创建 MSALPublicClientApplication,如下所示:

MSALPublicClientApplicationConfig *config = [[MSALPublicClientApplicationConfig alloc] initWithClientId:@"your-client-id"
                                                                                            redirectUri:@"your-redirect-uri"
                                                                                              authority:nil];
    
config.cacheConfig.keychainSharingGroup = @"custom-group";
    
MSALPublicClientApplication *application = [[MSALPublicClientApplication alloc] initWithConfiguration:config error:nil];
    
// Now call `acquiretoken`. 
// Tokens will be saved into the "custom-group" access group
// and only shared with other applications declaring the same access group

禁用密钥链共享

如果你不想要在多个应用之间共享 SSO 状态,或不想使用任何密钥链访问组,请通过传递应用程序捆绑 ID 作为 keychainGroup,来禁用密钥链共享:

config.cacheConfig.keychainSharingGroup = [[NSBundle mainBundle] bundleIdentifier];

处理 -34018 错误(无法将项设置为密钥链)

错误 -34018 通常意味着未正确配置密钥链。 确保 MSAL 中配置的密钥链访问组与权利中配置的访问组匹配。

确保应用程序已正确签名

在 macOS 上,应用程序无需开发人员签名即可执行。 尽管 MSAL 的大部分功能可以继续工作,但通过密钥链访问实现的 SSO 要求为应用程序签名。 如果多次遇到密钥链提示,请确保应用程序的签名有效。

后续步骤

在 Apple 的 Sharing Access to Keychain Items Among a Collection of Apps(在一系列应用之间共享对密钥链项的访问权限)一文中详细了解密钥链访问组。