教程:在 Android 应用程序中使用共享设备模式
在本教程中,Android 开发人员和 Microsoft Entra 租户管理员将了解为 Android 应用启用共享设备模式所需的代码、Authenticator 应用和租户设置。
本教程的内容:
- 下载代码示例
- 启用和检测共享设备模式
- 检测单个或多个帐户模式
- 检测用户开关,并启用全局登录和注销
- 设置租户并注册应用程序
- 在共享设备模式下设置 Android 设备
- 运行示例应用
先决条件
- 具有活动订阅的 Azure 帐户。 创建帐户。
开发人员指南
教程的本部分为开发人员提供了使用 Microsoft 身份验证库 (MSAL) 在 Android 应用程序中实现共享设备模式的指导。 请参阅 MSAL Android 教程,了解如何将 MSAL 与 Android 应用集成、将用户登录、调用 Microsoft Graph 以及将用户注销。
下载示例
从 GitHub 克隆示例应用程序。 示例能够在单帐户或多帐户模式下工作。
将 MSAL SDK 添加到本地 Maven 存储库
如果你使用的不是示例应用,请在 build.gradle 文件中将 MSAL 库添加为依赖项,如下所示:
dependencies{
implementation 'com.microsoft.identity.client.msal:4.9.+'
}
将应用配置为使用共享设备模式
有关设置配置文件的详细信息,请参阅配置文档。
在 MSAL 配置文件中将 "shared_device_mode_supported"
设置为 true
。
你可能不打算支持多帐户模式。 如果使用的不是共享设备,并且用户可以同时使用多个帐户登录到应用,则可能会出现这种情况。 如果是这样,请将 "account_mode"
设置为 "SINGLE"
。 这可以确保你的应用始终获得 ISingleAccountPublicClientApplication
,并大大简化你的 MSAL 集成。 "account_mode"
的默认值为 "MULTIPLE"
,因此,如果使用 "single account"
模式,则必须在配置文件中更改此值。
下面是示例应用的 app>main>res>raw 目录中包括的 auth_config.json 文件的示例:
{
"client_id": "Client ID after app registration at https://portal.azure.cn/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview",
"authorization_user_agent": "DEFAULT",
"redirect_uri": "Redirect URI after app registration at https://portal.azure.cn/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview",
"account_mode": "SINGLE",
"broker_redirect_uri_registered": true,
"shared_device_mode_supported": true,
"authorities": [
{
"type": "AAD",
"audience": {
"type": "AzureADandPersonalMicrosoftAccount",
"tenant_id": "common"
}
}
]
}
检测共享设备模式
使用共享设备模式,你可以将 Android 设备配置为由多名员工共享,同时为设备提供由 Microsoft Identity 支持的管理。 员工可以登录到其设备并快速访问客户信息。 当他们完成其班次或任务后,只需要单击一次即可注销共享设备上的所有应用,设备就会立即准备就绪,可供下一位员工使用。
使用 isSharedDevice()
确定应用是否正在处于共享设备模式的设备上运行。 你的应用可以使用此标志来确定是否应当相应地修改 UX。
下面是一个代码片段,展示了可以如何使用 isSharedDevice()
。 它来自示例应用中的 SingleAccountModeFragment
类:
deviceModeTextView.setText(mSingleAccountApp.isSharedDevice() ? "Shared" : "Non-Shared");
初始化 PublicClientApplication 对象
如果在 MSAL 配置文件中设置了 "account_mode":"SINGLE"
,则可以放心地将返回的应用程序对象转换为 ISingleAccountPublicCLientApplication
。
private ISingleAccountPublicClientApplication mSingleAccountApp;
/*Configure your sample app and save state for this activity*/
PublicClientApplication.create(this.getApplicationCOntext(),
R.raw.auth_config,
new PublicClientApplication.ApplicationCreatedListener(){
@Override
public void onCreated(IPublicClientApplication application){
mSingleAccountApp = (ISingleAccountPublicClientApplication)application;
loadAccount();
}
@Override
public void onError(MsalException exception){
/*Fail to initialize PublicClientApplication */
}
});
检测单帐户与多帐户模式
如果编写的应用将仅用于共享设备上的一线员工,则建议将应用编写为仅支持单帐户模式。 这包括以任务为中心的大多数应用程序,例如医疗记录应用、发票应用和大多数业务线应用。 这将简化开发,因为不需要包含 SDK 的许多功能。
如果你的应用支持多个帐户和共享设备模式,则必须执行类型检查并强制转换为相应的接口,如下所示。
private IPublicClientApplication mApplication;
if (mApplication instanceOf IMultipleAccountPublicClientApplication) {
IMultipleAccountPublicClientApplication multipleAccountApplication = (IMultipleAccountPublicClientApplication) mApplication;
...
} else if (mApplication instanceOf ISingleAccountPublicClientApplication) {
ISingleAccountPublicClientApplication singleAccountApplication = (ISingleAccountPublicClientApplication) mApplication;
...
}
获取已登录用户并确定该设备上的用户是否已更改
loadAccount
方法检索已登录用户的帐户。 onAccountChanged
方法确定已登录用户是否已更改,如果已更改,则清除:
private void loadAccount()
{
mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback())
{
@Override
public void onAccountLoaded(@Nullable IAccount activeAccount)
{
if (activeAccount != null)
{
signedInUser = activeAccount;
mSingleAccountApp.acquireTokenSilentAsync(SCOPES,"http://login.partner.microsoftonline.cn/common",getAuthSilentCallback());
}
}
@Override
public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable Iaccount currentAccount)
{
if (currentAccount == null)
{
//Perform a cleanup task as the signed-in account changed.
updateSingedOutUI();
}
}
@Override
public void onError(@NonNull Exception exception)
{
}
}
}
将用户全局登录
以下操作将设备中的用户登录到将 MSAL 与验证器应用结合使用的其他应用:
private void onSignInClicked()
{
mSingleAccountApp.signIn(getActivity(), SCOPES, null, getAuthInteractiveCallback());
}
将用户全局注销
以下操作将删除已登录的帐户,并从应用中以及处于共享设备模式下的设备中同时清除缓存的令牌:
private void onSignOutClicked()
{
mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback()
{
@Override
public void onSignOut()
{
updateSignedOutUI();
}
@Override
public void onError(@NonNull MsalException exception)
{
/*failed to remove account with an exception*/
}
});
}
接收广播以检测从其他应用程序启动的全局注销
若要接收帐户更改广播,需要注册广播接收器。 建议通过上下文注册的接收器注册广播接收器。
接收到帐户更改广播后,立即获取已登录用户,并确定设备上的用户是否已更改。 如果检测到更改,则为以前登录的帐户启动数据清理。 建议适当停止任何操作,并进行数据清理。
以下代码片段演示如何注册广播接收器。
private static final String CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER = "com.microsoft.identity.client.sharedmode.CURRENT_ACCOUNT_CHANGED";
private BroadcastReceiver mAccountChangedBroadcastReceiver;
private void registerAccountChangeBroadcastReceiver(){
mAccountChangedBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//INVOKE YOUR PRIOR ACCOUNT CLEAN UP LOGIC HERE
}
};
IntentFilter filter = new
IntentFilter(CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER);
this.registerReceiver(mAccountChangedBroadcastReceiver, filter);
}
管理员指南
以下步骤介绍了如何设置应用程序,并将设备置于共享设备模式。
注册应用程序
首先,在你的组织租户中注册应用程序。 然后,在 auth_config.json 中提供以下值,以便你的应用程序能够正常运行。
有关如何执行此操作的信息,请参阅注册应用程序。
注意
注册应用时,请使用左侧的快速入门指南,然后选择“Android” 。 这会出现一个页面,要求你为应用提供包名称和签名哈希。 这些值对于确保你的应用程序配置正常运行非常重要。 然后,你会收到一个配置对象,可将其用于你要剪切并粘贴到 auth_config.json 文件中的应用。
应选择“为我进行此更改”,然后提供快速入门要求的值。 完成此操作后,我们会生成你需要的所有配置文件。
设置租户
若要进行测试,请在租户中设置以下各项:至少两名员工、一名云设备管理员和一名全局管理员。 通过修改组织角色来设置云设备管理员。 通过选择“标识”>“角色和管理员”>“角色和管理员”>“所有角色”来访问你的组织角色,然后选择“云设备管理员”。 添加可将设备置于共享模式的用户。
在共享模式下设置 Android 设备
下载验证器应用
从 Google Play 商店下载 Microsoft Authenticator 应用。 如果已安装该应用,请确保它是最新版本。
验证器应用设置以及在云中注册设备
启动验证器应用,并导航到主帐户页面。 看到“添加帐户” 页面后,便可将设备置于共享模式了。
使用右侧菜单栏转到“设置” 窗格。 在“工作和学校帐户”下选择“设备注册”。
单击此按钮时,系统将要求你授权访问设备联系人。 这是由于设备上的 Android 帐户集成导致的。 选择“允许” 。
云设备管理员应在“或注册为共享设备” 下输入其组织电子邮件。 然后,单击“注册为共享设备” 按钮并输入其凭据。
设备现在已处于共享模式。
设备上的任何登录和注销都是全局性的,这意味着它们将应用于与设备上的 MSAL 和 Microsoft Authenticator 集成的所有应用。 你现在可以将应用程序部署到使用共享设备模式功能的设备了。
查看共享设备
将设备置于共享模式后,它会为你的组织所知,并将在你的组织租户中受到跟踪。 可以通过查看“联接类型”来查看共享设备。
运行示例应用
该示例应用程序是一个简单应用,它调用你的组织的图形 API。 首次运行时,系统将提示你表明是否同意,因为对于你的员工帐户而言,该应用程序是新的。
后续步骤
详细了解如何在 Android 设备上使用 Microsoft 身份验证库和共享设备模式: