適用於 Android 裝置的共用裝置模式

前線工作者如零售員工、機組人員及現場服務人員,經常使用共用的行動裝置來執行工作。 這些共用裝置若用戶有意或無意分享密碼或 PIN 以存取共用裝置上的客戶及企業資料,可能會帶來安全風險。

共享裝置模式 允許你設定 Android 8.0 或更高版本的裝置,讓員工能安全地共享裝置。 員工只需登入一次,即可獲得所有支援此功能的應用程式的單一登入(SSO),讓他們更快取得資訊。 當員工完成輪班或工作之後登出時,他們會自動登出裝置和所有支援的應用程式,讓裝置準備好供下一位使用者使用。

為了善用共享裝置模式功能,應用程式開發者與雲端裝置管理員會共同合作:

  1. 裝置管理員會準備裝置以便手動或使用像 Microsoft Intune 這樣的行動裝置管理(MDM)服務商來分享。 慣用選擇是使用 MDM,因為它允許透過零接觸佈署將裝置大規模設置為共用裝置模式。 MDM 會將 Microsoft Authenticator 應用程式推送到裝置,並透過對裝置進行受管理的設定更新,為每台裝置開啟「共享模式」。 這個共享模式設定會改變裝置上支援應用程式的行為。 此配置由 MDM 提供者設定裝置的共享模式,並透過 Authenticator App 觸發共享裝置註冊。

  2. 應用程式開發 者會撰寫一個單一帳號應用程式(共享裝置模式下不支援多帳號應用程式),以處理以下情境:

    • 透過任何受支援的應用程式,讓使用者在整部裝置上登入
    • 透過任何支援的應用程式,將使用者從所有裝置登出
    • 查詢裝置狀態,判斷你的應用程式是否在共享裝置模式下的裝置上
    • 查詢使用者的裝置狀態,以判斷自上次使用以來應用程式是否有變動

    支援共享裝置模式應視為您的應用程式的功能升級,並有助於在多個使用者共用同一裝置的環境中提升其採用率。

    重要事項

    支援 Android 共享裝置模式的 Microsoft 應用程式不需要任何更改,只要安裝在裝置上即可享有共享裝置模式的好處。

在共享裝置模式下設定裝置

要設定你的 Android 裝置支援共享裝置模式,應該是運行 Android OS 8.0 或更新版本。 裝置也應該透過恢復出廠設定或卸載並重新安裝所有啟用 Microsoft 及其他共享裝置模式的應用程式來清除。

Microsoft Intune 支援 Microsoft Entra 共享裝置模式下的零觸控配置,這表示裝置可以在 Intune 中設定並註冊,且前線工作人員幾乎不需要互動。 若要在使用 Microsoft Intune 作為 MDM 時,以 Microsoft Entra 共用裝置模式設定裝置,請參閱 設定 Microsoft Entra 共用裝置模式中裝置的註冊

修改你的 Android 應用程式以支援共享裝置模式

你的用戶依賴你確保他們的資料不會洩漏給其他使用者。 以下章節提供有用的訊號,告知您的申請已發生變更並需處理。 你必須每次使用應用程式時檢查使用者在裝置上的狀態,然後清除前一位使用者的資料。 這也包括在多工處理時從背景狀態重新載入的情況。 在使用者變更時,你應該確保前一位使用者的資料都被清除,並且移除應用程式中顯示的任何快取資料。 我們強烈建議您和您的公司在更新應用程式以支援共享裝置模式後,進行安全審查程序。

將 Microsoft 驗證資源庫 (MSAL) SDK 加入您的應用程式相依系統

在你的 build.gradle 檔案中加入 MSAL 函式庫作為相依,就像這樣:

dependencies{
  implementation 'com.microsoft.identity.client.msal:5.+'
}

將您的應用程式設定為使用共用裝置模式

使用 Microsoft 驗證程式庫 (MSAL) SDK 所撰寫的應用程式,可以管理單一帳戶或多個帳戶。 如需詳細資料,請參閱單一帳戶模式或多帳戶模式。 共享裝置模式的應用程式只能支援單一帳號模式。

如果你不打算支援多帳號模式,請在 MSAL 設定檔中設定"account_mode"為 。"SINGLE" 這可保證您的應用程式一律會取得 ISingleAccountPublicClientApplication,並大幅簡化您的 MSAL 整合。 "account_mode" 的預設值是 "MULTIPLE",因此若使用 "single account" 模式,請務必在組態檔中變更此值。

這裡有一個設定檔的範例:

{
  "client_id": "Client ID after app registration at https://aka.ms/MobileAppReg",
  "authorization_user_agent": "WEBVIEW",
  "redirect_uri": "Redirect URI after app registration at https://aka.ms/MobileAppReg",
  "account_mode": "SINGLE",
  "broker_redirect_uri_registered": true,
  "authorities": [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

如需有關設定組態檔的詳細資訊,請參閱設定文件

支援單一帳號與多帳號

您可以建置應用程式,以支援同時在個人裝置和共用裝置上執行。 如果您的應用程式目前支援多個帳戶,而且您想要支援共用裝置模式,請新增單一帳戶模式的支援。

您也可能想要應用程式變更其行為,取決於其執行所在的裝置類型。 使用 ISingleAccountPublicClientApplication.isSharedDevice() 來決定何時要在單一帳戶模式下執行。

有兩個不同的介面,代表您應用程式所在的裝置類型。 當您從 MSAL 的應用程式工廠要求應用程式執行個體時,系統會自動提供正確的應用程式物件。

下列物件模型說明您可能會收到的物件類型,以及其在共用裝置內容中的意義:

公開客戶端應用繼承模型

在取得 PublicClientApplication 物件時,必須進行類型檢查並轉換成適當的介面。 下列程式碼會檢查多帳戶模式或單一帳戶模式,並相應地轉換應用程式物件:

private IPublicClientApplication mApplication;

        // Running in personal-device mode?
        if (mApplication instanceOf IMultipleAccountPublicClientApplication) {
          IMultipleAccountPublicClientApplication multipleAccountApplication = (IMultipleAccountPublicClientApplication) mApplication;
          ...
        // Running in shared-device mode?
        } else if (mApplication instanceOf ISingleAccountPublicClientApplication) {
           ISingleAccountPublicClientApplication singleAccountApplication = (ISingleAccountPublicClientApplication) mApplication;
            ...
        }

下列差異適用,取決於您的應用程式是在共用裝置還是在個人裝置上執行:

共用模式裝置 個人裝置
帳戶 單一帳戶 多個帳戶
登入 全球 全球
登出 全球 每個應用程式都可以控制登出是否在應用程式的本地進行。
支援的帳戶類型 僅限工作帳戶 支援的個人和工作帳戶

初始化 PublicClientApplication 物件

如果您在 MSAL 組態檔中設定 "account_mode":"SINGLE",您可以將傳回的應用程式物件安全地轉換為 ISingleAccountPublicCLientApplication

private ISingleAccountPublicClientApplication mSingleAccountApp;

PublicClientApplication.create(
    this.getApplicationCOntext(),
    R.raw.auth_config_single_account,
    new PublicClientApplication.ApplicationCreatedListener() {

        @Override
        public void onCreated(IPublicClientApplication application){
            mSingleAccountApp = (ISingleAccountPublicClientApplication)application;
        }

        @Override
        public void onError(MsalException exception){
            /*Fail to initialize PublicClientApplication */
        }
    });

偵測共用裝置模式

偵測共享裝置模式對你的應用程式很重要。 許多應用程式在共用裝置上使用時,需要改變使用者體驗(UX)。 例如,你的應用程式可能有「註冊」功能,但這不適合第一線工作者,因為他們很可能已經有帳號。 如果你的應用程式處於共享裝置模式,你也可以考慮在資料處理上增加額外的安全性。

請使用 isSharedDevice API IPublicClientApplication 來判斷應用程式是否在裝置上以共享裝置模式運行。

以下程式碼片段展示了使用 isSharedDevice API 的範例。

deviceModeTextView.setText(mSingleAccountApp.isSharedDevice() ? "Shared" : "Non-Shared");

取得已登入使用者,並判斷裝置上的使用者是否已變更

支援共享裝置模式的另一個重要部分是判斷使用者在裝置上的狀態,並在使用者變更或裝置上完全沒有使用者時清除應用程式資料。 你有責任確保資料不會外洩給其他使用者。

你可以用 getCurrentAccountAsync API 查詢裝置上目前已登入的帳號。

loadAccount 方法會擷取登入使用者的帳戶。 onAccountChanged 方法會判斷登入的使用者是否已變更,如果是,則執行清除作業:

private void loadAccount()
{
  mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback())
  {
    @Override
    public void onAccountLoaded(@Nullable IAccount activeAccount)
    {
      if (activeAccount != null)
      {
        signedInUser = activeAccount;
        final AcquireTokenSilentParameters silentParameters = new AcquireTokenSilentParameters.Builder()
                        .fromAuthority(signedInUser.getAuthority())
                        .forAccount(signedInUser)
                        .withScopes(Arrays.asList(getScopes()))
                        .withCallback(getAuthSilentCallback())
                        .build();
        mSingleAccountApp.acquireTokenSilentAsync(silentParameters);
      }
    }
    @Override
    public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable Iaccount currentAccount)
    {
      if (currentAccount == null)
      {
        //Perform a cleanup task as the signed-in account changed.
        cleaUp();
      }
    }
    @Override
    public void onError(@NonNull Exception exception)
    {
        //getCurrentAccountAsync failed
    }
  }
}

全局性登入使用者

當裝置被設定為共享裝置時,你的應用程式可以呼叫 signIn API 登入該帳號。 當第一個應用程式登入帳號後,該帳號將對裝置上所有符合資格的應用程式開放。

final SignInParameters signInParameters = ... /* create SignInParameters object */
mSingleAccountApp.signIn(signInParameters);

全域登出使用者

以下程式碼會移除已登入的帳號,並清除應用程式及共享裝置中快取的令牌。 不過,它不會清除應用程式 中的資料 。 你必須清除應用程式中的資料,並清除應用程式可能向使用者顯示的任何快取資料。

mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback() {
    @Override
    public void onSignOut() {
        // clear data from your application
    }

    @Override
    public void onError(@NonNull MsalException exception) {
        // signout failed, show error
    }
});

接收廣播以偵測從其他應用程式起始的全域登出

若要接收帳戶變更廣播,您必須註冊廣播接收器。 建議您透過 Context 註冊的接收器註冊廣播接收器。

收到帳戶變更廣播時,立即獲取當前登入的使用者,並確認裝置上的使用者是否已變更。 如果偵測到變更,就會開始為先前登入的帳戶進行資料清理。 建議您適當地停止所有作業並清除資料。

下列程式碼片段示範如何註冊廣播接收器。

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);
}

支援共享裝置模式的 Microsoft 應用程式

以下 Microsoft 應用程式支援 Microsoft Entra 共享裝置模式:

支援共用裝置模式的第三方 MDM

這些第三方行動裝置管理(MDM)提供者支援 Microsoft Entra 的共用裝置模式:

共用裝置登出與整體應用程式生命週期

當使用者登出時,你需要採取行動來保護使用者的隱私和資料。 舉例來說,如果你正在開發一個醫療紀錄應用程式,你要確保使用者登出時,先前顯示的病患紀錄會被清除。 您的應用程式必須做好資料隱私方面的準備,並在每次進入前景時進行檢查。

當您的應用程式使用 MSAL 在處於共用模式的裝置上執行的應用程式中將使用者登出時,已登入的帳戶和已快取的權杖都會從應用程式和裝置中移除。

下圖顯示了整個應用程式生命週期以及應用程式運行時可能發生的常見事件。 圖表涵蓋了從活動啟動的時間、登入與簽出帳號,以及暫停、繼續和停止等事件如何融入其中。

共享裝置應用程式生命週期

下一步

設定 Android 裝置以共用裝置模式執行應用程式,並測試您的應用程式。

適用於 Android 裝置的共用裝置模式