Android デバイスの共有デバイス モード
小売店員、航空機乗組員、フィールド サービス ワーカーなどのフロントライン ワーカーは多くの場合、共有モバイル デバイスを使用して作業を行います。 これらの共有デバイスでは、ユーザーが意図的か否かにかかわらず、パスワードや PIN を共有して、共有デバイス上の顧客データやビジネス データにアクセスする場合に、セキュリティ上のリスクをもたらす可能性があります。
共有デバイス モードを使用すると、従業員がさらに容易かつ安全に共有できるように、Android 8.0 以降のデバイスを構成できるようになります。 従業員は 1 回サインインすると、この機能をサポートするすべてのアプリにシングル サインオン (SSO) でき、情報にすばやくアクセスできるようになります。 シフトまたはタスクの完了後に従業員がサインアウトすると、デバイスとサポートされているすべてのアプリケーションから自動的にサインアウトされ、デバイスは次のユーザーに対応できるようになります。
共有デバイス モード機能を利用するには、アプリ開発者とクラウド デバイス管理者が協力して作業します。
デバイス管理者は、手動または Microsoft Intune のようなモバイル デバイス管理 (MDM) プロバイダーを使用して、デバイスの共有を準備します。 推奨されるオプションは、MDM を使用することです。これにより、ゼロタッチ プロビジョニングを使用して共有デバイス モードで大規模にデバイスをセットアップできます。 MDM は、デバイスに Microsoft Authenticator アプリをプッシュし、デバイスに対する管理された構成の更新を通じて、各デバイスの "共有モード" をオンにします。 この共有モード設定は、デバイスでサポートされているアプリの動作を変更するものです。 MDM プロバイダーからのこの構成は、デバイスの共有デバイス モードを設定し、Authenticator アプリを使用して共有デバイスの登録をトリガーします。
アプリケーション開発者 は、単一アカウント アプリ (共有デバイス モードでは複数アカウント アプリはサポートされていません) を記述して、以下のシナリオに対処します:
- サポートされている任意のアプリケーションを介して、ユーザーをデバイス全体にサインインさせます。
- サポートされている任意のアプリケーションを介して、ユーザーをデバイス全体からサインアウトさせます。
- デバイスの状態についてクエリを実行し、アプリケーションが共有デバイス モードのデバイス上にあるかどうかを判断します。
- ユーザーのデバイス状態についてクエリを実行し、最後に使用されてからアプリケーションで何か変更されたのかどうかを判断します。
共有デバイス モードのサポートは、アプリケーションの機能アップグレードとして考える必要必要があります。また、同じデバイスが複数のユーザー間で使用される環境での導入の拡大に役立ちます。
重要
Android で共有デバイス モードをサポートする Microsoft アプリケーションは、共有デバイス モードに伴う利点を得るために変更する必要はなく、デバイスにインストールするだけで済みます。
共有デバイス モードでデバイスを設定する
共有デバイス モードをサポートするように Android デバイスを構成するには、Android OS 8.0 以降を実行している必要があります。 デバイスは、出荷時の設定にリセットするか、すべての Microsoft およびその他の共有デバイス モードが有効になっているアプリをアンインストールして再インストールすることによってもワイプする必要があります。
Microsoft Intune では、Microsoft Entra 共有デバイス モードのデバイスに対するゼロタッチ プロビジョニングがサポートされています。つまり、フロントライン ワーカーの最小限の操作で、デバイスを設定し、Intune に登録できます。 MDM として Microsoft Intune を使用するときに共有デバイス モードでデバイスを設定するには、「Microsoft Entra 共有デバイス モードでのデバイスの登録設定」を参照してください。
共有デバイス モードをサポートするように Android アプリケーションを変更する
ユーザーはデータが他のユーザーに漏洩することがないように、管理者に依存しています。 次のセクションでは、アプリケーションに、変更が発生し、処理する必要があることを示すために役立つシグナルを提供します。 開発者は、アプリが使用されるたびにデバイス上のユーザーの状態を確認し、以前のユーザーのデータをクリアする必要があります。 これには、マルチタスクの実行中にバックグラウンドから再読み込みするかどうかを含みます。 ユーザーの変更時に、前のユーザーのデータがクリアされ、アプリケーションで表示されるキャッシュされたデータがすべて削除されるようにする必要があります。 共有デバイス モードをサポートするようにアプリを更新したら、管理者と会社でセキュリティ レビュー プロセスを実施することを強くお勧めします。
アプリケーションの依存関係に Microsoft Authentication Library (MSAL) SDK を追加する
次のように MSAL ライブラリを依存関係として自分の build.gradle ファイルに追加します。
dependencies{
implementation 'com.microsoft.identity.client.msal:5.+'
}
共有デバイス モードを使用するようアプリを構成する
Microsoft Authentication Library (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()
を使用します。
アプリケーションが実行しているデバイスの種類を表す 2 つの異なるインターフェイスが存在します。 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;
...
}
アプリが共有デバイスまたは個人デバイスのどちらで実行されているかに応じて、次の違いが適用されます。
共有モード デバイス | 個人デバイス | |
---|---|---|
Accounts | 単一のアカウント | 複数のアカウント |
サインイン | グローバル | グローバル |
サインアウト | グローバル | 各アプリケーションは、サインアウトがアプリに対してローカルかどうかを制御できます。 |
サポートされているアカウントの種類 | 職場アカウントのみ | サポートされている個人アカウントと業務用アカウント |
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) を変更する必要があります。 たとえば、アプリケーションに "サインアップ" 機能がある場合があります。これは、現場担当者は、既にアカウントを持っている可能性があるため、適していません。 また、共有デバイス モードになっている場合は、アプリケーションのデータ処理に特別なセキュリティを追加することもできます。
IPublicClientApplication
で isSharedDevice
API を使用すると、共有デバイス モードのデバイスでアプリが実行しているかどうかを特定できます。
次のコード スニペットは、isSharedDevice
API の使用例を示しています。
deviceModeTextView.setText(mSingleAccountApp.isSharedDevice() ? "Shared" : "Non-Shared");
サインインしているユーザーを取得し、デバイスでユーザーが変更されたかどうかを特定する
共有デバイス モードをサポートするもう 1 つの重要な部分は、デバイス上のユーザーの状態を判断することと、ユーザーが変更された場合、またはデバイスにユーザーがいない場合に、アプリケーション データをクリアすることです。 開発者は、データが別のユーザーに漏洩しないようにする必要があります。
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
}
});
ブロードキャストを受信して、他のアプリケーションから開始されたグローバル サインアウトを検出する
アカウント変更ブロードキャストを受信するには、ブロードキャスト レシーバーを登録する必要があります。 コンテキスト登録されたレシーバーを介してブロードキャスト レシーバーを登録することをお勧めします。
アカウント変更ブロードキャストを受信したら、すぐにサインインしているユーザーを取得し、デバイスでユーザーが変更されたかどうかを判断します。 変更が検出された場合は、前にサインインしていたアカウントのデータのクリーンアップを開始します。 すべての操作を適切に停止し、データのクリーンアップを行うことをお勧めします。
次のコード スニペットは、ブロードキャスト レシーバーを登録する方法を示しています。
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 の共有デバイス モードをサポートしています。
- Microsoft Teams
- Microsoft Viva Engage (旧称 Yammer)
- Outlook
- Microsoft Power Apps
- Microsoft 365
- Microsoft Power BI Mobile
- Microsoft Edge
- マネージド ホーム スクリーン
共有デバイス モードをサポートするサードパーティ製 MDM
次のサード パーティ製モバイル デバイス管理 (MDM) は、Microsoft Entra の shared device mode のサポートを提供しています。
共有デバイスのサインアウトとアプリのライフサイクル全体
ユーザーがサインアウトしたら、そのユーザーのプライバシーとデータを保護するためのアクションを実行する必要があります。 たとえば、医療記録アプリを構築している場合は、ユーザーがサインアウトしたら、以前に表示された患者記録が消去されていることを確認する必要があります。 アプリケーションは、フォアグラウンドに入るたびに、データのプライバシーとチェックに備える必要があります。
アプリが、共有モードのデバイス上で実行されているアプリで MSAL を使用してユーザーをサインアウトすると、サインイン アカウントとキャッシュされているトークンがアプリとデバイスの両方から削除されます。
次の図は、アプリのライフサイクル全体と、アプリの実行中に発生する可能性のある共通イベントを示しています。 このダイアグラムには、アクティビティの開始時刻から、アカウントのサインインとサインアウト、およびアクティビティの一時停止、再開、停止などのイベントがどのように整合しているかまで含まれています。
次のステップ
共有デバイス モードでアプリを実行し、アプリをテストするように Android デバイスを設定します。