无Azure AD管理权限下iOS端MSAL集成问题咨询
客户已切换使用Azure AD,我方需更新自有应用适配该身份体系,当前无客户方Azure AD管理门户访问权限,也无可用测试用户凭据,仅掌握以下已知信息:
- 登录入口地址:https://myapplications.microsoft.com
- 浏览器端登录流程共三步:第一步输入邮箱地址,第二步输入密码,第三步输入短信下发的OTP验证码,同时支持Microsoft Authenticator完成验证
- 认证流程走完后默认跳转至Azure应用列表页面,我方需求为自有应用中不展示该页面:用户输入OTP完成Microsoft Graph API认证后,应用直接接管后续流程,认证所用webview需在认证完成后自动关闭。
我方前期调研了大量MSAL相关资料,因无测试凭据、无Azure AD管理权限,只能在无验证环境下开展盲开发。开发参考为Objective-C版本MSAL官方开源仓库(https://github.com/AzureAD/microsoft-authentication-library-for-objc),开发环境为Xcode 13.4.1 + Swift。
通过Safari网页检查器抓取目标Azure AD应用的请求数据,已配置如下MSAL常量:
let kClientID = "2793995e-0a7d-40d7-bd35-6968ba142197" // 可能不正确,见下文问题1 let kGraphEndpoint = "https://graph.microsoft.com/" // 未在网页检查器数据中找到,参考多数MSAL示例代码配置 let kAuthority = "https://login.microsoftonline.com/common/" // 从网页检查器数据中获取 let kRedirectUri = "https://myapplications.microsoft.com" // 认证完成后跳转的URL let kScopes: [String] = ["User.Read"] // 未在网页检查器数据中找到,参考多数MSAL示例代码配置
- 前述登录入口页面中固定展示client_id为
2793995e-0a7d-40d7-bd35-6968ba142197,按照认知每个Azure AD应用都有独立client_id,因此该通用client_id应该不正确,能否通过Safari网页检查器抓取的目标应用数据定位到正确的client_id? - 当前配置的常量可正常拉起登录流程,但测试人员完成登录后,展示所有Azure AD应用的最终页面会持续停留;而公开的MSAL示例代码在用户输入凭据完成认证后会自动关闭认证页面,请问认证webview的自动关闭是由服务端(Azure AD配置)控制还是客户端控制?
- 测试人员通过应用完成登录后,若通过应用切换器将应用挂起再重新打开,需要重新走完完整的登录流程,
acquireTokenSilently静默登录功能不生效,但在Safari浏览器中静默登录可正常工作,该问题是什么原因导致的? - 能否通过Safari网页检查器抓取的数据获取所需的产品bundle identifier,用于配置
msauth.$(PRODUCT_BUNDLE_IDENTIFIER)格式的重定向URI?
- 认证完成后不展示Graph API门户的应用列表页面
- 应用从挂起状态恢复后可保持登录状态,
acquireTokenSilently()接口正常工作 - 若设备安装了Microsoft Authenticator,优先使用该应用完成认证
我方此前从未接触过Azure AD相关开发,需要关于配置错误、认知误区的相关提示。
再次明确前提:我方既无Azure AD门户访问权限,也无任何测试凭据(用户名、密码、短信OTP码),经过大量测试与模拟仍未解决问题。
普通用户在Safari浏览器中的正常登录流程
- 访问https://myapplications.microsoft.com
- 输入组织专属邮箱地址启动认证流程
- Azure识别对应租户,校验邮箱地址存在性后要求输入密码
- 后续根据设备配置,要么下发短信OTP验证码,要么拉起Microsoft Authenticator代理完成验证,具体验证方式由设备配置决定
- 最终跳转至Azure应用列表页面
iOS端当前异常现象
在iOS/macOS端(Xcode开发的自有应用)中上述流程表现类似,但MSAL调试日志显示未返回任何token,acquireToken()接口仅在webview被手动取消时才会完成回调,返回MSAL错误码-50005,我方推测Web应用本身不需要使用token?
当前我方在iOS应用中仅需要获取到访问token,即可在URL请求中携带Bearer令牌访问对应Web应用,现有两个疑问:
- 如何在不跳转至不返回token的应用列表页面的前提下,获取该Web应用对应的访问token?
- Azure AD是否支持使用获取到的token访问该Web应用?
我方已知对应的服务端解决方案是在Azure AD认证配置板块添加对应MY_BUNDLE_ID的重定向URI,但我方无法进行该服务端配置操作。
内容的提问来源于stack exchange,提问作者geohei

