使用 MSAL 在 Android 上启用跨应用 SSO
单一登录 (SSO) 使用户可以仅输入一次凭据,然后让这些凭据自动跨应用程序工作。它可以减少用户需要管理的密码数、降低密码疲劳和关联漏洞的风险,从而提升用户体验和安全性。
Microsoft 标识平台和 Microsoft 身份验证库 (MSAL) 可帮助你在自己的一套应用中启用 SSO。 通过启用代理功能,可以跨整个设备扩展 SSO。
本操作指南介绍了如何配置应用程序所使用的 SDK,以便向客户提供 SSO。
先决条件
本操作指南假定你知道如何执行以下操作:
- 预配应用。 有关详细信息,请参阅 Android 教程中有关创建应用的说明
- 将应用程序与适用于 Android 的 MSAL 集成
SSO 的方法
应用程序可通过两种方式,使用适用于 Android 的 MSAL 来实现 SSO:
通过中转身份验证的 SSO
建议使用 Microsoft 的某一个身份验证中介来参与设备范围的 SSO,并保证符合组织条件访问策略的要求。 与中介集成可提供以下优势:
- 设备 SSO
- 对以下功能进行条件访问:
- Intune 应用保护
- 设备注册 (Workplace Join)
- 移动设备管理
- 设备范围的帐户管理
- 通过 Android AccountManager 和帐户设置
- “工作帐户”- 自定义帐户类型
在 Android 上,Microsoft 身份验证代理是随附在 Microsoft Authenticator、Intune 公司门户和连接至 Windows 应用中的一个组件。
下图演示了应用、MSAL 与 Microsoft 身份验证中转站之间的关系。
安装托管中介的应用
设备所有者随时可以从应用商店(通常是 Google Play 商店)安装中介托管应用。 但是,某些 API(资源)受条件访问策略的保护,这些策略要求设备:
- 已注册(已加入工作区),和/或
- 已在设备管理中注册,或
- 已在 Intune 应用保护中注册
如果具有上述要求的设备上尚未安装代理应用,当应用尝试以交互方式获取令牌时,MSAL 会立即指示用户安装一个代理应用。 然后,应用将引导用户完成相关步骤,使设备符合所需的策略。 如果没有策略要求,或者用户使用 Microsoft 帐户登录,则不需要安装代理应用。
安装和卸载中介的影响
已安装中介时
在设备上安装中介后,所有后续交互式令牌请求(对 acquireToken()
的调用)将由该中介处理,而不是由 MSAL 在本地处理。 以前提供给 MSAL 的任何 SSO 状态不会提供给中转站。 因此,用户需要重新进行身份验证,或者从设备已知的现有帐户列表中选择一个帐户。
安装中介无需用户再次登录。 仅当用户需要解决 MsalUiRequiredException
时,下一个请求才会发送到中介。 引发 MsalUiRequiredException
的原因有很多,需要以交互方式解决。 例如:
- 用户更改了与其帐户关联的密码。
- 用户的帐户不再符合条件访问策略。
- 用户撤销了应用与其帐户关联的许可。
多个代理 - 如果设备上安装了多个代理,MSAL 将自行标识活动代理来完成身份验证过程
已卸载中介时
如果只安装了一个中转站托管应用,并且移除了该应用,则用户需要再次登录。 卸载活动中介会从设备中删除相应的帐户和关联的令牌。
如果卸载 Microsoft Authenticator、Intune 公司门户或连接至 Windows,则可能会要求用户再次登录。
与中介集成
为中介生成重定向 URI
提示
本文中的步骤可能因开始使用的门户而略有不同。
必须注册与中介兼容的重定向 URI。 中介的重定向 URI 应该包含应用的包名称,以及应用签名的 base64 编码表示形式。
重定向 URI 的格式为:msauth://<yourpackagename>/<base64urlencodedsignature>
可以使用 keytool 通过应用的签名密钥生成 Base64 编码的签名哈希,然后使用该哈希生成重定向 URI。
Linux 和 macOS:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Windows:
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
使用 keytool 生成签名哈希后,请使用 Azure 门户生成重定向 URI:
- 至少以云应用程序管理员身份登录到 Microsoft Entra 管理中心。
- 如果有权访问多个租户,请使用顶部菜单中的“设置”图标 ,从“目录 + 订阅”菜单切换到包含应用注册的租户。
- 浏览到“标识”>“应用程序”>“应用注册”。
- 选择你的应用程序,然后选择“身份验证”>“添加平台”>“Android”。
- 在“配置 Android 应用”窗格打开时,输入你之前生成的“签名哈希”,然后输入“包名称” 。
- 选择“配置”按钮。
会为你生成重定向 URI,并将其显示在“Android 配置”窗格的“重定向 URI”字段中。
有关对应用进行签名的详细信息,请参阅 Android Studio 用户指南中的对应用进行签名。
将 MSAL 配置为使用中介
若要在应用中使用中介,必须证明你已配置中介重定向。 例如,通过在 MSAL 配置文件中包含以下设置,来包含中介启用的重定向 URI,并指示已注册该中介:
"redirect_uri" : "<yourbrokerredirecturi>",
"broker_redirect_uri_registered": true
中介相关的异常
MSAL 通过两种方式来与中介通信:
- 中介绑定服务
- Android AccountManager
MSAL 首先使用中介绑定服务,因为调用此服务不需要任何 Android 权限。 如果绑定到绑定服务失败,MSAL 将使用 Android AccountManager API。 仅当已为应用授予 "READ_CONTACTS"
权限时,MSAL 才使用此 API。
如果收到 MsalClientException
和错误代码 "BROKER_BIND_FAILURE"
,可以采取两种做法:
- 要求用户禁用 Microsoft Authenticator 应用和 Intune 公司门户的超级优化。
- 要求用户授予
"READ_CONTACTS"
权限
验证中转站集成
虽然可能无法立即弄清楚中介集成是否正在运行,但你可以使用以下步骤进行检查:
- 在 Android 设备上,使用中介完成某个请求。
- 在 Android 设备上的设置中,查找与进行身份验证时所使用的帐户相对应的新建帐户。 该帐户的类型应为“工作帐户”。
如果要重复测试,可以从设置中删除该帐户。
通过系统浏览器的 SSO
Android 应用程序可以选择使用 WEBVIEW
、系统浏览器或 Chrome 自定义选项卡进行身份验证用户体验。 如果应用程序未使用中转站身份验证,则需要使用系统浏览器,而不是本机 Webview 来实现 SSO。
授权代理
为授权代理选择特定的策略非常重要,这是应用可以自定义的附加功能。 建议使用“WEBVIEW”。 若要了解有关其他配置值的详细信息,请参阅了解 Android MSAL 配置文件。
MSAL 支持使用 WEBVIEW
或系统浏览器授权。 下图显示了使用 WEBVIEW
或使用包含或不包含自定义标签页的系统浏览器进行授权的大致形式:
SSO 影响
如果应用程序使用 WEBVIEW
策略,而不将中转身份验证集成到其应用中,则用户将不会获得跨设备或在本机应用与 Web 应用之间的单一登录体验。
应用程序可以与 MSAL 集成,以使用 BROWSER
进行授权。 与 WEBVIEW 不同,BROWSER
与默认系统浏览器共享 Cookie jar,可以减少与自定义标签页集成的 Web 应用或其他本机应用中的登录次数。
如果应用程序使用具有代理(例如 Microsoft Authenticator、Intune 公司门户或连接至 Windows)的 MSAL,并且用户在其中某一个应用中拥有一个有效的登录名,则用户可以获得跨应用程序的 SSO 体验。
注意
具有中转站的 MSAL 利用 WebView,并为使用 MSAL 库和参与中转身份验证的所有应用程序提供单一登录 (SSO)。来自中转站的 SSO 状态不会扩展到不使用 MSAL 的其他应用。
WebView
若要使用应用中 WebView,请在传递给 MSAL 的应用配置 JSON 中添加以下行:
"authorization_user_agent" : "WEBVIEW"
使用应用中 WEBVIEW
时,用户可以直接登录到应用。 令牌保留在应用的沙盒内部,不能在应用 Cookie jar 的外部使用。 因此,除非应用与 Microsoft Authenticator 应用、Intune 公司门户或连接至 Windows 集成,否则用户无法获得跨应用程序的 SSO 体验。
但是,WEBVIEW
确实提供用于自定义登录 UI 外观的功能。 有关如何进行这种自定义的详细信息,请参阅 Android WebView。
浏览器
尽管我们提供了使用浏览器和自定义选项卡策略的选项,但还是建议使用 WEBVIEW。 可以在自定义配置文件中使用以下 JSON 配置显式指定此策略:
"authorization_user_agent" : "BROWSER"
使用此方法可通过设备的浏览器提供 SSO 体验。 MSAL 使用共享的 Cookie jar,使其他本机应用或 Web 应用能够使用 MSAL 设置的持久会话 Cookie 在设备上实现 SSO。
浏览器选择试探法
由于 MSAL 无法指定可在众多 Android 手机上使用的确切浏览器包,因此 MSAL 实施浏览器选择试探法,以尝试提供最佳的跨设备 SSO。
MSAL 主要从包管理器中检索默认浏览器,并检查它是否在已测试的安全浏览器列表中。 如果不在,MSAL 将退回到使用 Web 视图,而不是从安全列表启动其他非默认浏览器。 始终会选择默认浏览器,无论其是否支持自定义选项卡。 如果浏览器支持自定义选项卡,MSAL 将启动自定义选项卡。自定义标签页的外观更接近应用中 WebView
,允许基本的 UI 自定义。 有关详细信息,请参阅 Android 中的自定义标签页。
如果设备上没有浏览器包,MSAL 将使用应用中 WebView
。 如果设备默认设置未更改,则每次登录时应启动同一浏览器,以确保提供 SSO 体验。
已测试的浏览器
我们已对以下浏览器进行测试,以确定它们是否可以正确重定向到配置文件中指定的 "redirect_uri"
:
设备 | 内置浏览器 | Chrome | Opera | Microsoft Edge | UC 浏览器 | Firefox |
---|---|---|---|---|---|---|
Nexus 4 (API 17) | 通过 | 通过 | 不适用 | 不适用 | 不适用 | 不适用 |
Samsung S7 (API 25) | 通过1 | 通过 | 通过 | 通过 | 失败 | pass |
Vivo (API 26) | 通过 | 通过 | 通过 | 通过 | 通过 | 失败 |
Pixel 2 (API 26) | 通过 | 通过 | 通过 | 通过 | 失败 | 通过 |
Oppo | pass | 不适用2 | 不适用 | 不适用 | 不适用 | 不适用 |
OnePlus (API 25) | 通过 | 通过 | 通过 | 通过 | 失败 | 通过 |
Nexus (API 28) | 通过 | 通过 | 通过 | 通过 | 失败 | 通过 |
MI | 通过 | 通过 | 通过 | 通过 | 失败 | 通过 |
1Samsung 的内置浏览器是 Samsung Internet。
2无法在 Oppo 设备设置中更改默认浏览器。
后续步骤
使用适用于 Android 设备的共享设备模式,可以对 Android 设备进行配置,使其可由多名员工轻松共享。
有关代理应用程序的详细信息,请转到以下页面: