在Unity开发的iOS应用中使用MSAL实现SSO单点登录的问题咨询
Unity iOS端集成MSAL实现单点登录解决方案
核心思路
不需要自行实现适配webview,MSAL官方iOS原生实现默认调用系统级安全认证会话ASWebAuthenticationSession,完全符合微软的安全校验要求,也能自动处理登录后的回调和token回传。你之前编译的.NET版MSAL dll可以保留用来处理token缓存、静默登录、接口鉴权等逻辑,仅交互登录环节走原生侧对接即可。
具体实现步骤
- 第一步:调整C#层的平台分支逻辑,iOS端不再直接调用.NET MSAL的
AcquireTokenInteractive方法,改为调用封装的原生MSAL登录接口 - 第二步:导出Xcode工程后做基础配置
- 在Info.plist的URL Types中添加重定向URI对应的Scheme,比如你的重定向URI为
msal{你的clientID}://auth,就把msal{你的clientID}填入URL Schemes字段 - 开启项目的Keychain Sharing能力,添加
com.microsoft.adalcache、com.microsoft.msalcache两个keychain组,保证MSAL可以正常读写凭证缓存 - 通过CocoaPods引入原生MSAL库,pod配置为
pod 'MSAL'即可
- 在Info.plist的URL Types中添加重定向URI对应的Scheme,比如你的重定向URI为
- 第三步:编写iOS原生桥接代码,暴露登录方法给Unity调用
原生侧接收C#层传入的client id、重定向URI、租户地址、权限域等参数,初始化MSAL客户端后触发交互登录,登录完成后将access token、过期时间、用户信息等参数回调给C#层 - 第四步:C#层接收原生返回的凭证后,可直接存入.NET MSAL的缓存中,后续静默登录、刷新token、接口调用都可以复用你原有.NET MSAL的逻辑
现有代码适配示例
IPublicClientApplication PublicClientApp = PublicClientApplicationBuilder .Create(kClientID) .WithRedirectUri(kRedirectUri) .WithAuthority(new Uri(kAuthority)) .Build(); IEnumerable<string> scopes = new List<string> { "https://graph.microsoft.com/.default" }; AuthenticationResult result; #if UNITY_IOS && !UNITY_EDITOR // iOS平台走原生MSAL登录逻辑 string accessToken = await iOSMSALBridge.Instance.RequestTokenAsync(kClientID, kRedirectUri, kAuthority, scopes); // 可根据原生返回的完整凭证信息构造AuthenticationResult对象,方便后续逻辑统一处理 result = new AuthenticationResult(accessToken, false, null, DateTimeOffset.UtcNow.AddHours(1), DateTimeOffset.UtcNow.AddHours(1), null, null, null, Guid.NewGuid()); #else // 其他平台保留原有交互登录逻辑 result = await PublicClientApp.AcquireTokenInteractive(scopes) .ExecuteAsync(); #endif Debug.Log(result.AccessToken);
注意事项
- 不要自定义webview加载微软登录页,微软的身份校验逻辑会拦截非系统会话的自定义webview请求,触发风控导致登录失败
- 重定向URI必须和Azure后台配置的完全一致,否则系统登录完成后无法回调回你的应用
- 必须开启Keychain Sharing权限,否则MSAL无法正常缓存凭证,每次重启应用都需要重新登录
内容的提问来源于stack exchange,提问作者TRS
相关产品推荐
相关产品推荐

