教程:在 Android 应用程序中使用共享设备模式

在本教程中,Android 开发人员和 Microsoft Entra 租户管理员将了解为 Android 应用启用共享设备模式所需的代码、Authenticator 应用和租户设置。

本教程的内容:

  • 下载代码示例
  • 启用和检测共享设备模式
  • 检测单个或多个帐户模式
  • 检测用户开关,并启用全局登录和注销
  • 设置租户并注册应用程序
  • 在共享设备模式下设置 Android 设备
  • 运行示例应用

先决条件

开发人员指南

教程的本部分为开发人员提供了使用 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 文件中的应用。

Configure your Android app page

应选择“为我进行此更改”,然后提供快速入门要求的值。 完成此操作后,我们会生成你需要的所有配置文件。

Configure your project page

设置租户

若要进行测试,请在租户中设置以下各项:至少两名员工、一名云设备管理员和一名全局管理员。 通过修改组织角色来设置云设备管理员。 通过选择“标识”>“角色和管理员”>“角色和管理员”>“所有角色”来访问你的组织角色,然后选择“云设备管理员”。 添加可将设备置于共享模式的用户。

在共享模式下设置 Android 设备

下载验证器应用

从 Google Play 商店下载 Microsoft Authenticator 应用。 如果已安装该应用,请确保它是最新版本。

验证器应用设置以及在云中注册设备

启动验证器应用,并导航到主帐户页面。 看到“添加帐户” 页面后,便可将设备置于共享模式了。

Authenticator add account screen

使用右侧菜单栏转到“设置” 窗格。 在“工作和学校帐户”下选择“设备注册”。

Authenticator settings screen

单击此按钮时,系统将要求你授权访问设备联系人。 这是由于设备上的 Android 帐户集成导致的。 选择“允许” 。

Authenticator allow access confirmation screen

云设备管理员应在“或注册为共享设备” 下输入其组织电子邮件。 然后,单击“注册为共享设备” 按钮并输入其凭据。

Device registration screen in app

App screenshot showing Microsoft sign-in page

设备现在已处于共享模式。

App screen showing shared device mode enabled

设备上的任何登录和注销都是全局性的,这意味着它们将应用于与设备上的 MSAL 和 Microsoft Authenticator 集成的所有应用。 你现在可以将应用程序部署到使用共享设备模式功能的设备了。

查看共享设备

将设备置于共享模式后,它会为你的组织所知,并将在你的组织租户中受到跟踪。 可以通过查看“联接类型”来查看共享设备。

Screenshot that shows the all devices pane

运行示例应用

该示例应用程序是一个简单应用,它调用你的组织的图形 API。 首次运行时,系统将提示你表明是否同意,因为对于你的员工帐户而言,该应用程序是新的。

Application configuration info screen

后续步骤

详细了解如何在 Android 设备上使用 Microsoft 身份验证库和共享设备模式: