Xamarin PCL iOS项目钥匙串访问组配置问题及AD B2C缓存方案求助
我来帮你理清这个MSAL + Xamarin iOS钥匙串配置的问题,核心是要兼顾MSAL的权限要求和多项目的数据隔离:
首先,MSAL(Microsoft.Identity.Client)在iOS上存储令牌依赖苹果的钥匙串服务,它默认会尝试访问[你的Apple团队ID].com.microsoft.adalcache这个钥匙串组。你最初只配置自己的com.companyname.YYYYY组时,MSAL没有权限访问它需要的默认组,所以抛出了保存失败的异常。而改成微软默认组后,虽然能正常存储,但这个组是通用的——多个项目用同一个钥匙串组,自然会互相覆盖缓存的令牌数据。
你完全不需要修改应用的Bundle ID(CFBundleIdentifier),这是错误的操作,会导致应用身份混乱。正确的步骤应该是这样:
1. 保留应用自身的Info.plist配置
你的应用标识相关配置保持不变,这是应用的唯一身份:
CFBundleIdentifier:com.companyname.YYYYYCFBundleName:YYYYYCFBundleURLName:com.companyname.YYYYYCFBundleURLSchemes:msal[你的APPLICATION ID](这个配置是对的,不用改)
2. 调整Entitlements.plist的钥匙串组
在Entitlements.plist的Keychain Access Groups里添加两个条目:
[你的Apple团队ID].com.microsoft.adalcache(MSAL运行时必须访问的默认组)[你的Apple团队ID].com.companyname.YYYYY(你的应用专属的钥匙串组,保证数据隔离)
3. 初始化MSAL时指定专属钥匙串组
在创建PublicClientApplication的时候,通过构建器显式指定你应用的专属钥匙串组,这样MSAL就会用这个组来存储令牌,不会和其他项目冲突。示例代码:
var pca = PublicClientApplicationBuilder .Create("[你的AD B2C应用ID]") .WithIosKeychainSecurityGroup("[你的Apple团队ID].com.companyname.YYYYY") .Build();
当你把CFBundleIdentifier和钥匙串组都改成微软的默认值时,相当于让多个项目共享同一个应用身份和钥匙串空间,iOS会把它们识别为同一个应用的不同实例,缓存数据自然会被覆盖。保持每个应用有独立的Bundle ID,并让MSAL绑定对应应用的专属钥匙串组,就能彻底解决这个问题。
内容的提问来源于stack exchange,提问作者rwahid

