Android 用 Intune App SDK - アプリ参加機能

Microsoft Intune App SDK for Android を使用すると、Intune アプリ保護ポリシー ( APP または MAM ポリシーとも呼ばれます) をネイティブの Java/Kotlin Android アプリに組み込むことができます。 Intune で管理されるアプリケーションは、Intune App SDK と統合されたアプリケーションです。 Intune 管理者は、Intune がアプリをアクティブに管理するときに、Intune で管理されるアプリにアプリ保護ポリシーを簡単に展開できます。

注:

このガイドは、いくつかの異なるステージに分かれています。 まず、「統合の 計画」を確認します。

ステージ 7: アプリ参加機能

ステージの目標

  • Intune App SDK によって提供されるさまざまなアプリ参加機能について説明します。
  • アプリとユーザーに関連するアプリ参加機能を統合します。
  • これらの機能の統合をテストします。

"アプリ参加機能" とは

この SDK 統合プロセスは、開発者が記述する必要があるアプリ固有のコードの量を最小限に抑えようとします。 SDK 統合の前の段階を正常に完了することで、アプリは、ファイルの暗号化、コピー/貼り付けの制限、スクリーンショットのブロック、データ転送の制限など、アプリ保護ポリシー設定の大部分を適用できるようになりました。

ただし、アプリ固有のコードを適切に適用する必要がある設定がいくつかあります。これらは、アプリ参加機能と呼ばれます。 通常、SDK には、アプリケーションのコードやエンド ユーザーシナリオに関する十分なコンテキストがないため、これらの設定を自動的に適用するため、開発者は SDK API を適切に呼び出します。

アプリ参加機能は必ずしも省略可能ではありません。 アプリの既存の機能によっては、これらの機能が必要になる場合があります。 詳細については、「 SDK 統合に関する重要な決定事項 」を参照してください。

このガイドの前の段階では、いくつかのアプリ参加機能について既に説明しています。

このガイドの残りの部分では、アプリ参加機能の残りのセットについて説明します。

  • ローカルストレージまたはクラウドストレージからファイルを保存/開くポリシーを適用します。
  • 通知のコンテンツを制限するポリシーを適用します。
  • バックアップ データを保護するポリシーを適用します。
  • 画面キャプチャを制限するポリシーを適用します (アプリにカスタム画面キャプチャ コードがある場合)。
  • App Protection CA をサポートします。
  • SDK からの通知に登録します。
  • カスタム アプリケーションのテーマを適用します。
  • Intune からの信頼された証明書を使用して、オンプレミス エンドポイントへの信頼のチェーンを確保します。

アプリ参加機能の基本

AppPolicy インターフェイスには、特定のアクションが許可されているかどうかをアプリに通知する多くのメソッドが含まれています。

ほとんどのアプリ参加機能には次が含まれます。

  • アクションが許可されているかどうかを確認するために、アプリのコード内の適切な場所を特定します。
  • AppPolicy メソッドを呼び出して、現在構成されているポリシーに基づいてアクションが許可されているかどうかを確認します。
  • 結果に応じて、アクションの完了を許可するか、アクションがブロックされたときにアプリの動作を変更します。

AppPolicy インスタンスを取得するには、getPolicygetPolicyForIdentity(final String identity)などの MAMPolicyManager メソッドのいずれかを使用します。

AppPolicy の情報メソッド

AppPolicyのすべてのメソッドがアプリ参加機能に関連付けられているわけではありません。 一部のメソッドは情報に基づくものであり、ポリシーが SDK によって自動的に適用されている場合でも、ポリシーが現在構成されているアプリ データを提供します。 これらのメソッドは、特定のポリシーが構成されたときにカスタム ユーザー エクスペリエンスを表示する機会をアプリに提供するために存在します。

例: スクリーンショットがブロックされているかどうかを判断する

アプリにスクリーンショットを取得できるコントロールがある場合は、アプリ保護ポリシーでスクリーンショットがブロックされているかどうかをそのコントロールを無効または非表示にすることができます。

アプリは、 MAMPolicyManager.getPolicy(currentActivity).getIsScreenCaptureAllowed()を呼び出すことによってこれを確認できます。

アプリとデバイスまたはクラウドストレージの場所間のデータ転送を制限するためのポリシー

多くのアプリでは、エンド ユーザーがローカル ファイル ストレージまたはクラウド ストレージ サービスにデータを保存したり、ローカル ファイル ストレージ サービスからデータを開いたりすることができます。 Intune App SDK を使用すると、IT 管理者は、アプリがデータを保存してデータを開く場所を制限することで、データのイングレスやデータ漏洩から保護できます。

注:

アプリで個人またはクラウドの場所への直接の保存が許可されている場合 、または データをアプリに直接開くことを許可する場合は、IT 管理者がこの保存/開きをブロックできるように、この Intune App SDK アプリ参加機能を実装する必要があります

デバイスまたはクラウド ストレージへの保存

getIsSaveToLocationAllowed API を使用すると、構成されたポリシーに基づいて、特定の ID に対して特定の場所への保存が許可されているかどうかをアプリで認識できます。

MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(
SaveLocation service, String username);

アプリで getIsSaveToLocationAllowed チェックを実装する必要があるかどうかを判断するには、次の表を確認して、アプリがデータエグレスをサポートしているかどうかを判断します。

serviceパラメーター: 列挙値SaveLocation 使用例 関連付けられたユーザー名
ONEDRIVE_FOR_BUSINESS アプリは OneDrive にデータを保存しています。 クラウド サービス認証と Microsoft Entra 認証の両方に使用されるアカウントの username 。 このようなユーザー名が存在しない場合、またはユーザー名が不明な場合は、 nullを使用します。
SHAREPOINT アプリは Sharepoint にデータを保存しています。 クラウド サービス認証と Microsoft Entra 認証の両方に使用されるアカウントの username 。 このようなユーザー名が存在しない場合、またはユーザー名が不明な場合は、 nullを使用します。
BOX このアプリは Box にデータを保存しています。 クラウド サービス認証と Microsoft Entra 認証の両方に使用されるアカウントの username 。 このようなユーザー名が存在しない場合、またはユーザー名が不明な場合は、 nullを使用します。
LOCAL アプリは、アプリのプライベート ストレージ ではない デバイス上の外部ストレージの場所にデータを保存しています。 外部ストレージはクラウド サービスとは見なされないため、常に null username パラメーターと共に使用する必要があります。
PHOTO_LIBRARY アプリは、Androidのローカル写真ストレージにデータを保存しています。 Android ローカル写真ストレージはクラウド サービスとは見なされないため、常に null username パラメーターで使用する必要があります。
ACCOUNT_DOCUMENT アプリは、アプリ内のアカウントに関連付けられている場所にデータを保存しており、上記で指定した特定のクラウドの場所の 1 つではありません。 *この場所は、マルチ ID アプリ内のアカウント間でデータを渡すことができるかどうかを判断するために使用する必要があります。 Microsoft Entra 認証に使用されるアカウントの username 。 このようなユーザー名が存在しない場合、またはユーザー名が不明な場合は、 nullを使用します。
OTHER アプリは、上記で指定されていない場所にデータを保存しており、 ACCOUNT_DOCUMENTの条件を満たしていません。 usernameはこの場所に対して評価されないため、nullする必要があります。

アプリの操作に必要なプライベート アプリ ストレージに配置されたファイル、または表示のために一時的にダウンロードされたファイルは常に許可されます。 getIsSaveToLocationAllowedを確認する必要はありません。 SaveLocation.LOCALを確認する

  1. プライベート アプリ ストレージの外部に保存されたファイル。
  2. アプリ操作に必要ないプライベート アプリ ストレージにダウンロードされたファイル (たとえば、ユーザーが意図的にデバイスにダウンロードすることを選択した場合など)。

注:

保存ポリシーを確認する場合、 username は、保存先のクラウド サービス 関連付けられている UPN/ユーザー名/電子メールである必要があります (必ずしも、保存するドキュメントを所有するアカウントと同じとは限りません )。

ローカルまたはクラウドのストレージの場所からデータを開く

getIsOpenFromLocationAllowed API を使用すると、構成されたポリシーに基づいて、特定の場所からのオープンが特定の ID に対して許可されているかどうかをアプリで認識できます。

MAMPolicyManager.getPolicy(currentActivity).getIsOpenFromLocationAllowed(
OpenLocation location, String username);

アプリが getIsOpenFromLocationAllowed チェックを実装する必要があるかどうかを判断するには、次の表を確認して、アプリがデータイングレスをサポートしているかどうかを判断します。

locationパラメーター: 列挙値OpenLocation 使用例 関連付けられたユーザー名
ONEDRIVE_FOR_BUSINESS アプリが OneDrive からデータを開いています。 クラウド サービス認証と Microsoft Entra 認証の両方に使用されるアカウントの username 。 このようなユーザー名が存在しない場合、またはユーザー名が不明な場合は、 nullを使用します。
SHAREPOINT アプリが Sharepoint からデータを開いています。 クラウド サービス認証と Microsoft Entra 認証の両方に使用されるアカウントの username 。 このようなユーザー名が存在しない場合、またはユーザー名が不明な場合は、 nullを使用します。
CAMERA アプリがカメラからデータを開いています。 デバイス カメラがクラウド サービスではないので、 null 値。
LOCAL アプリは、アプリのプライベート ストレージ ではない デバイス上の外部ストレージの場所からデータを開いています。 外部ストレージはクラウド サービスの場所ではありませんが、所有権を示しているため、 username パラメーターが必要です。
ローカル ストレージからファイルを開くとき、ファイル所有者は常に考慮する必要があります。ファイル所有者の名前付き保存ポリシーでは、他の ID によるファイルの開き方が許可される場合と許可されない場合があるためです。
- ID タグ付きファイルの場合は、username は、ファイル所有者の ID である必要があります。
- ID タグのないファイルの場合は、usernamenullする必要があります。
PHOTO_LIBRARY アプリは、Android 写真のローカル ストレージからデータを開いています。 Android ローカル写真ストレージはクラウド サービスとは見なされないため、常に null username パラメーターで使用する必要があります。
ACCOUNT_DOCUMENT アプリは、アプリ内のアカウントに関連付けられている場所からデータを開き、上記で指定した特定のクラウドの場所の 1 つではありません。 *この場所は、マルチ ID アプリ内のアカウント間でデータを渡すことができるかどうかを判断するために使用する必要があります。 Microsoft Entra 認証に使用されるアカウントの username 。 このようなユーザー名が存在しない場合、またはユーザー名が不明な場合は、 nullを使用します。
OTHER アプリは、上記で指定されていない場所からデータを開き、 ACCOUNT_DOCUMENTの条件を満たしていません。 usernameはこの場所に対して評価されないため、nullする必要があります。

注:

開いているポリシーを確認する場合、 username、開いている ファイルまたはクラウド サービスに関連付けられている UPN/username/電子メールである必要があります (ドキュメントを開いているアカウントと必ずしも同じとは限りません )。

ヒント

便宜上、SDK は、ローカル ストレージ内のファイルのFile パラメーターを受け取るメソッド AppPolicy.isOpenFromLocalStorageAllowedを提供します。 ポリシーの適用に関する用語は、Fileからのファイル所有者のusernameの解析を処理する点を除き、AppPolicy.isOpenFromLocationAllowed(OpenLocation.LOCAL, username)の呼び出しと機能的に同じです。

[ブロックされた共有] ダイアログ

SDK には、MAM ポリシーによってデータ転送アクションがブロックされたことをユーザーに通知するダイアログが用意されています。

isSaveToAllowedForLocationまたはisOpenFromAllowedForLocation API 呼び出しの結果、保存/開くアクションがブロックされるたびに、ダイアログをユーザーに表示する必要があります。 ダイアログには汎用メッセージが表示され、無視されると呼び出し元の Activity に戻ります。

ダイアログを表示するには、次のコードを追加します。

MAMUIHelper.showSharingBlockedDialog(currentActivity)

ファイル共有を許可する

パブリック ストレージの場所への保存が許可されていない場合でも、アプリはユーザーが ファイルをアプリプライベート ストレージ にダウンロードし、システム選択ツールで開くことによってファイルを表示できるようにする必要があります。

通知内のコンテンツを制限するためのポリシー

単一 ID アプリの場合、Intune App SDK の既定の動作では、App Protection Policy が通知を制限すると 、すべての 通知がブロックされます。

SDK の既定の動作は制限されています。 SDK では、通知から管理されたコンテンツのみを削除することを目的とした "組織データのブロック" 値を自動的に適用することはできません。 マルチ ID アプリの場合、SDK では、マネージド コンテンツを含む通知を特定できません。

アプリに通知が表示され、マルチ ID または "組織データのブロック" 値を適用する場合は、通知を表示する前に、通知に関連付けられているアカウントの通知制限ポリシーを確認する必要があります。

ポリシーが適用されているかどうかを判断するには、次の呼び出しを行います。

NotificationRestriction notificationRestriction =
    MAMPolicyManager.getPolicyForIdentity(notificationIdentity).getNotificationRestriction();

返される NotificationRestriction 列挙型には、次の値があります。

NotificationRestriction Enum 予想されるアプリの動作
BLOCKED アプリは、このポリシーに関連付けられているアカウントの通知を表示 してはなりませんシングル ID アプリの場合、Intune App SDK はすべての通知を自動的にブロックし、追加のコードは必要ありません。
BLOCK_ORG_DATA アプリには、組織データを含まない変更された通知が表示されている必要があります。
UNRESTRICTED アプリはすべての通知を表示する必要があります。

アプリが getNotificationRestrictionを適切に呼び出さない場合、MAM SDK は 、シングル ID アプリに対してのみ通知を自動的に制限するように最善の努力をします。

この場合、 BLOCK_ORG_DATABLOCKED と同じように扱われ、通知はまったく表示されません。

きめ細かい制御を行う場合は、 getNotificationRestriction の値を確認し、アプリ通知を適切に変更します。

バックアップ データを保護するためのポリシー

Intune App SDK では、Android の組み込みのバックアップと復元機能へのデータアップロードをブロックできます。 Android でのバックアップと復元の詳細については、「 Android API ガイド 」と「Android S/ 12 で導入された変更: バックアップと復元への変更」を参照してください。

アプリの自動バックアップ

Android M 以降、Android では、アプリのターゲット API に関係なく、Google Drive for Apps への 自動完全バックアップ の提供が開始されました。

Intune では、データ保護を確実に適用するための特定の Intune 統合ガイダンスを使用して、XML でカスタム ルールを定義する機能など、Android から利用できるすべての自動バックアップ機能を利用できます。

アプリのマニフェストでのバックアップ動作の構成

既定では、バックアップの有効化と無効化に関するページで説明されているように、android:allowBackuptrue に設定されています。

アプリで完全バックアップと復元機能が必要ない場合は、 android:allowBackup を false に設定 しますこの場合、これ以上のアクションは必要なく、"企業" データはアプリ内に残ります。

アプリで完全バックアップと復元機能が必要な場合は、 android:allowBackuptrue に設定し、次の追加手順を実行します。

  1. アプリで独自のカスタム BackupAgentを使用しない場合は、既定の MAMBackupAgent を使用して、Intune ポリシーに準拠した自動完全バックアップを許可します。 アプリ マニフェストに次を配置します。

    <application
    ...
      android:fullBackupOnly="true"
      android:backupAgent="com.microsoft.intune.mam.client.app.backup.MAMDefaultBackupAgent"
      ...>
      </application>
    
  2. [省略可能]オプションのカスタム BackupAgentを実装した場合は、MAMBackupAgent または MAMBackupAgentHelper を必ず使用する必要があります。 次のセクションを参照してください。 手順 1 で説明されている Intune の MAMDefaultBackupAgent の使用に切り替えることを検討してください。これは、Android M 以降で簡単にバックアップできます。

  3. アプリで受け取るフル バックアップの種類 (フィルターなし、フィルター処理、またはなし) を決定する場合は、属性 android:fullBackupContent を true、false、またはアプリ内の XML リソースに設定する必要があります。

  4. 次に、android:fullBackupContentの値を com.microsoft.intune.mam.FullBackupContent メタデータ タグにコピーし、API 31 で追加された新しい XML 構成形式をサポートするアプリの値を com.microsoft.intune.mam.DataExtractionRules メタデータ タグにコピーする必要があります

    • 例 1: アプリで完全バックアップを除外せずに作成する場合は、属性とメタデータ タグを true に設定する必要があります。

      <application
        ...
        android:fullBackupContent="true"
        ...>
      </application>
      ...
      <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="true" />
      <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:value="true" />
      
    • 例 2: アプリでカスタム BackupAgent を使用し、Intune ポリシーに準拠した完全な自動バックアップをオプトアウトする場合は、属性とメタデータ タグを false に設定する必要があります。

      <application
        ...
        android:fullBackupContent="false"
        ...>
      </application>
      ...
      <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="false" />
      <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:value="false" />
      
    • 例 3: XML ファイルで定義されているカスタム 規則に従ってアプリに完全バックアップを作成する場合は、属性とメタデータ タグを同じ XML リソースに設定します。

      <application
        ...
        android:fullBackupContent="@xml/my_full_backup_content_scheme"
        android:dataExtractionRules="@xml/my_data_extraction_rules_scheme"
        ...>
      </application>
      ...
      <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:resource="@xml/my_full_backup_content_scheme" />
      <meta-data android:name="com.microsoft.intune.mam.DataExtractionRules" android:resource="@xml/my_data_extraction_rules_scheme" />
      

キー/値のバックアップ

[キー/値のバックアップ] オプションは、すべての API 8 以降で使用でき、アプリ データを Android Backup Service にアップロードします。 アプリあたりのデータ量は 5 MB に制限されています。 キー/値バックアップを使用する場合は、 BackupAgentHelper または BackupAgent を使用する必要があります。

BackupAgentHelper

BackupAgentHelper は、ネイティブ Android 機能と Intune MAM 統合 BackupAgentHelper の両方で BackupAgent よりも実装が簡単で、開発者はファイル全体と共有設定を FileBackupHelperSharedPreferencesBackupHelper (それぞれ) に登録し、作成時に BackupAgentHelper に追加できます。 Intune MAM で BackupAgentHelper を使用するには、次の手順に従います。

  1. BackupAgentHelperでマルチ ID バックアップを利用するには、Android ガイドに従って BackupAgentHelper を拡張します

  2. クラスで、BackupAgentHelper、FileBackupHelper、SharedPreferencesBackupHelper と同等の MAM を拡張します。

Android クラス MAM に相当する
BackupAgentHelper MAMBackupAgentHelper
FileBackupHelper MAMFileBackupHelper
SharedPreferencesBackupHelper MAMSharedPreferencesBackupHelper

これらのガイドラインに従うと、マルチ ID のバックアップと復元が成功します。

BackupAgent

BackupAgent を使用すると、バックアップされるデータをより明確にすることができます。 開発者は実装に対してかなり責任を負うため、Intune からの適切なデータ保護を確保するためにさらに多くの手順が必要です。 ほとんどの作業が開発者にプッシュされるため、Intune の統合は少し複雑になります。

MAM を統合する:

  1. Key/Value Backup の Android ガイドと特に BackupAgent の拡張を慎重に読み、BackupAgent の実装が Android ガイドラインに従っていることを確認してください。

  2. クラスで MAMBackupAgent を拡張します。

マルチ ID バックアップ:

  1. バックアップを開始する前に、バックアップする予定のファイルまたはデータ バッファーが、実際に IT 管理者によってマルチ ID シナリオでの バックアップが許可されていることを 確認します。 MAMFileProtectionManagerMAMDataProtectionManagerisBackupAllowedを使用して、これを判断します。 ファイルまたはデータ バッファーのバックアップが許可されていない場合は、バックアップに含めてはいけません。

  2. バックアップ中のある時点で、手順 1 でチェックインしたファイルの ID をバックアップする場合は、データを抽出する予定のファイルで backupMAMFileIdentity(BackupDataOutput data, File … files) を呼び出す必要があります。 これにより、新しいバックアップ エンティティが自動的に作成され、 BackupDataOutput に書き込まれます。 これらのエンティティは、復元時に自動的に使用されます。

複数 ID の復元: データ バックアップ ガイドでは、アプリケーションのデータを復元するための一般的なアルゴリズムを指定し、「 BackupAgent の拡張 」セクションのコード サンプルを提供します。 マルチ ID の復元を正常に行うには、このコード サンプルで提供されている一般的な構造に従い、次に特に注意する必要があります。

  1. バックアップ エンティティを通過するには、 while(data.readNextHeader())* ループを使用する必要があります。

  2. data.getKey()onBackupで記述したキーと一致しない場合は、data.skipEntityData()を呼び出す必要があります。 この手順を実行しないと、復元が成功しない可能性があります。

  3. 自動的に書き込むエンティティが失われるので、 while(data.readNextHeader())* コンストラクトでバックアップ エンティティを使用しているときには、戻らないようにします。

  • ここで data は、復元時にアプリに渡される MAMBackupDataInput のローカル変数名です。

カスタム画面キャプチャの制限

Android の Window レベルの FLAG_SECURE 制限をバイパスするカスタム画面キャプチャ機能がアプリに含まれている場合は、機能へのフル アクセスを許可する前に画面キャプチャ ポリシーを確認する必要があります。 たとえば、アプリでカスタム レンダリング エンジンを使用して現在のビューを PNG ファイルにレンダリングする場合は、最初に AppPolicy.getIsScreenCaptureAllowed()確認する必要があります。

注:

アプリにカスタムまたはサード パーティの画面キャプチャ機能が含まれていない場合は、画面キャプチャを制限するアクションを実行する必要はありません。 画面キャプチャ ポリシーは、すべての MAM 統合アプリに対して Window レベルで自動的に適用されます。 OS または別のアプリがアプリ内の Window をキャプチャしようとすると、必要に応じてブロックされます。 たとえば、ユーザーが Android の組み込みのスクリーンショットや画面記録機能を介してアプリの画面をキャプチャしようとすると、アプリからの参加なしにキャプチャが自動的に制限されます。

App Protection CA のサポート

アプリ保護 CA (条件付きアクセス) は、アプリベースの CA とも呼ばれ、アプリケーションが Intune App Protection ポリシーによって管理されるまでリソースへのアクセスを制限します。 Microsoft Entra ID では、CA で保護されたリソースにアクセスするためのトークンを付与する前に、アプリを APP によって登録および管理するように要求することで、これを適用します。

注:

App Protection CA のサポートには、バージョン 1.0.0 以上の MSAL ライブラリが必要です。

MSAL に準拠していない処理

アカウントのトークンを取得する場合、MSAL ライブラリは、アプリ保護ポリシー管理に準拠していないかどうかを示す MsalIntuneAppProtectionPolicyRequiredException を返すかスローすることがあります。 コンプライアンスの修復に使用するために、例外から追加のパラメーターを抽出できます ( 「MAMComplianceManager」を参照してください)。 修復が成功すると、アプリは MSAL を介してトークンの取得を再試行できます。

MAMComplianceManager

MAMComplianceManager インターフェイスは、ポリシーが必要なエラーが MSAL から受信されたときに使用されます。 アプリを準拠状態にするために呼び出す必要がある [remediateCompliance] メソッドが含まれています。 MAMComplianceManagerへの参照は次のように取得できます。

MAMComplianceManager mgr = MAMComponents.get(MAMComplianceManager.class);

// make use of mgr

返される MAMComplianceManager インスタンスは、 nullされないことが保証されます。

package com.microsoft.intune.mam.policy;

public interface MAMComplianceManager {
    void remediateCompliance(String upn, String aadId, String tenantId, String authority, boolean showUX);
}

remediateCompliance() メソッドは、Microsoft Entra ID が要求されたトークンを付与するための条件を満たすためにアプリを管理下に置こうとするために呼び出されます。 最初の 4 つのパラメーターは、MSAL AuthenticationCallback.onError() メソッドで受け取った例外から抽出できます (以下のコード サンプルを参照)。 最後のパラメーターはブール値であり、コンプライアンスの試行中に UX を表示するかどうかを制御します。

remediateCompliance では、この操作中にアプリがカスタマイズされた UX を表示する必要がないように、単純なブロック進行状況ダイアログが表示されます。 このダイアログは、コンプライアンス修復の進行中にのみ表示されます。最終的な結果は表示されません。 アプリは、コンプライアンス修復の試行の成功または失敗を処理するために、 COMPLIANCE_STATUS 通知の受信者を登録できます。 詳細については、「 コンプライアンスの状態通知 」を参照してください。

remediateCompliance() は、コンプライアンスの確立の一環として MAM 登録を開始する可能性があります。 登録通知の通知レシーバーが登録されている場合、アプリは登録通知を受け取ることがあります。 アプリの登録済み MAMServiceAuthenticationCallback には、登録のトークンを取得するために acquireToken() メソッドが呼び出されます。 acquireToken() は、アプリが独自のトークンを取得する前に呼び出されるため、トークンの取得が成功した後にアプリが実行するブックキーピングまたはアカウント作成タスクがまだ実行されていない可能性があります。 この場合、コールバックはトークンを取得できる必要があります。

acquireToken()からトークンを返できない場合、コンプライアンス修復の試行は失敗します。

要求されたリソースの有効なトークンを使用して後で updateToken を呼び出した場合、コンプライアンスの修復は、指定されたトークンを使用して直ちに再試行されます。

注:

ユーザーは既にブローカーをインストールし、MsalIntuneAppProtectionPolicyRequiredException例外を受け取る前にデバイスを登録するように誘導されているため、acquireToken()でサイレント トークンの取得は引き続き可能です。 これにより、ブローカーはキャッシュに有効な更新トークンを持ち、要求されたトークンのサイレント取得を成功させることができます。

AuthenticationCallback.onError() メソッドでポリシーが必要なエラーを受け取り、MAMComplianceManager を呼び出してエラーを処理するサンプルを次に示します。

public void onError(@Nullable MsalException exc) {
    if (exc instanceof MsalIntuneAppProtectionPolicyRequiredException) {

        final MsalIntuneAppProtectionPolicyRequiredException policyRequiredException =
            (MsalIntuneAppProtectionPolicyRequiredException) ex;

        final String upn = policyRequiredException.getAccountUpn();
        final String aadId = policyRequiredException.getAccountUserId();
        final String tenantId = policyRequiredException.getTenantId();
        final String authority = policyRequiredException.getAuthorityURL();

        MAMComplianceManager complianceManager = MAMComponents.get(MAMComplianceManager.class);
        complianceManager.remediateCompliance(upn, aadId, tenantId, authority, showUX);
    }
}

コンプライアンスの状態通知

アプリが COMPLIANCE_STATUSの種類の通知に登録すると、コンプライアンス修復試行の最終的な状態をアプリに通知するために MAMComplianceNotification が送信されます。 登録の詳細については、「 SDK からの通知の 登録」を参照してください。

public interface MAMComplianceNotification extends MAMUserNotification {
    MAMCAComplianceStatus getComplianceStatus();
    String getComplianceErrorTitle();
    String getComplianceErrorMessage();
}

getComplianceStatus() メソッドは、[MAMCAComplianceStatus] 列挙型の値としてコンプライアンス修復試行の結果を返します。

状態コード 説明
UNKNOWN 状態が不明です。 これは、予期しないエラーの理由を示している可能性があります。 ポータル サイトのログに追加情報が記載されている場合があります。
COMPLIANT コンプライアンスの修復が成功し、アプリがポリシーに準拠するようになりました。 MSAL トークンの取得を再試行する必要があります。
NOT_COMPLIANT コンプライアンスを修復できませんでした。 アプリは準拠していないため、エラー条件が修正されるまで MSAL トークンの取得を再試行しないでください。 追加のエラー情報は MAMComplianceNotification と共に送信されます。
SERVICE_FAILURE Intune サービスからコンプライアンス データを取得しようとしたときにエラーが発生しました。 ポータル サイトのログに追加情報が記載されている場合があります。
NETWORK_FAILURE Intune サービスへの接続中にエラーが発生しました。 ネットワーク接続が復元されたら、アプリでトークンの取得をもう一度試す必要があります。
CLIENT_ERROR クライアントに関連する何らかの理由で、コンプライアンスの修復が失敗しました。 たとえば、トークンや間違ったユーザーなどです。 追加のエラー情報は MAMComplianceNotification と共に送信されます。
PENDING 時間制限を超えたときに、状態応答がまだサービスから受信されていないため、コンプライアンスの修復が失敗しました。 アプリは、後でトークンの取得をもう一度試す必要があります。
COMPANY_PORTAL_REQUIRED コンプライアンスの修復を成功させるには、デバイスにポータル サイトをインストールする必要があります。 ポータル サイトが既にデバイスにインストールされている場合は、アプリを再起動する必要があります。 この場合、ユーザーにアプリの再起動を求めるダイアログが表示されます。

コンプライアンスの状態が MAMCAComplianceStatus.COMPLIANTされている場合、アプリは元のトークンの取得 (独自のリソース) を再開する必要があります。

コンプライアンス修復の試行が失敗した場合、 getComplianceErrorTitle() メソッドと getComplianceErrorMessage() メソッドは、選択した場合にアプリがエンド ユーザーに表示できるローカライズされた文字列を返します。 ほとんどのエラー ケースはアプリによって修復されないため、一般的なケースでは、アカウントの作成またはログインに失敗し、ユーザーが後でやり直すことを許可することをお勧めします。

エラーが永続的な場合は、ポータル サイト ログが原因の特定に役立つ場合があります。 エンド ユーザーはログを送信できます。 詳細については、「 アップロードと電子メール ログ」を参照してください。

MAMNotificationReceiver インターフェイスを実装するために匿名クラスを使用してレシーバーを登録する例を次に示します。

final MAMNotificationReceiverRegistry notificationRegistry = MAMComponents.get(MAMNotificationReceiverRegistry.class);
// create a receiver
final MAMNotificationReceiver receiver = new MAMNotificationReceiver() {
    public boolean onReceive(MAMNotification notification) {
        if (notification.getType() == MAMNotificationType.COMPLIANCE_STATUS) {
            MAMComplianceNotification complianceNotification = (MAMComplianceNotification) notification;
            
            // take appropriate action based on complianceNotification.getComplianceStatus()
            
            // unregister this receiver if no longer needed
            notificationRegistry.unregisterReceiver(this, MAMNotificationType.COMPLIANCE_STATUS);
        }
        return true;
    }
};
// register the receiver
notificationRegistry.registerReceiver(receiver, MAMNotificationType.COMPLIANCE_STATUS);

注:

通知が見逃される可能性がある競合状態を回避するには、 remediateCompliance() を呼び出す前に通知レシーバーを登録する必要があります。

App Protection CA のサポートの宣言

アプリがアプリ CA の修復を処理する準備ができたら、アプリがアプリ CA の準備ができていることを Microsoft ID に伝えることができます。 MSAL アプリケーションでこれを行うには、"protapp" のクライアント機能を使用してパブリック クライアントを構築します

{
      "client_id" : "[YOUR_CLIENT_ID]",
      "authorization_user_agent" : "DEFAULT",
      "redirect_uri" : "[YOUR_REDIRECT_URI]",
      "multiple_clouds_supported":true,
      "broker_redirect_uri_registered": true,
      "account_mode": "MULTIPLE",
      "client_capabilities": "protapp",
      "authorities" : [
        {
          "type": "AAD",
          "audience": {
            "type": "AzureADandPersonalMicrosoftAccount"
          }
        }
      ]
    }

上記を完了したら、以下の App Protection CA の検証 に進みます。

実装に関する注意事項

注:

アプリの MAMServiceAuthenticationCallback.acquireToken() メソッドは、forceRefresh フラグをacquireTokenSilentAsync()false を渡す必要があります。

AcquireTokenSilentParameters acquireTokenSilentParameters =
        builder.withScopes(Arrays.asList(scopes))
               .forceRefresh(false)
               .build();

acquireTokenSilentAsync(acquireTokenSilentParameters);

注:

修復の試行中にカスタム ブロック UX を表示する場合は、showUX パラメーターに false を 渡して remediateCompliance()する必要があります。 remediateCompliance()を呼び出す前に、まず UX を表示し、通知リスナーを登録する必要があります。 これにより、 remediateCompliance() が非常に迅速に失敗した場合に通知が見逃される可能性がある競合状態が回避されます。 たとえば、Activity サブクラスの onCreate() メソッドまたは onMAMCreate() メソッドは、通知リスナーを登録してから remediateCompliance()を呼び出すのに最適な場所です。 remediateCompliance()のパラメーターは、意図の追加として UX に渡すことができます。 コンプライアンス状態通知を受信すると、結果を表示するか、単にアクティビティを完了できます。

注:

remediateCompliance() はアカウントを登録し、登録を試みます。 メイン トークンが取得されると、 registerAccountForMAM() の呼び出しは必要ありませんが、そうしても害はありません。 一方、アプリがトークンの取得に失敗し、ユーザー アカウントを削除する場合は、 unregisterAccountForMAM() を呼び出してアカウントを削除し、バックグラウンド登録の再試行を防ぐ必要があります。

SDK からの通知に登録する

Intune App SDK ガイドでは、次のような SDK からの通知にアプリを登録する必要がある場合があるいくつかのシナリオについて既に説明しています。

このセクションでは、SDK が送信できるあらゆる種類の通知、アプリケーションでリッスンするタイミングと理由、および通知レシーバーを実装する方法について説明します。

通知の種類

すべての SDK 通知は、1 つの関数を持つ MAMNotification インターフェイスを実装 getType()MAMNotificationType 列挙型を返します。

ほとんどの通知は MAMUserNotificationsであり、1 つの ID に固有の情報を提供します。これは、 getUserIdentity() 関数を介して取得できます。

MAMEnrollmentNotificationMAMComplianceNotification は、さらに MAMUserNotificationを拡張します。この結果には、ユーザー/デバイスを MAM サービスに登録しようとした結果と、App Protection CA のコンプライアンスを修復しようとした結果がそれぞれ含まれます。

通知の種類 通知クラス 通知の理由 適用対象 処理のヒント スレッド情報
COMPLIANCE_STATUS MAMComplianceNotification コンプライアンス修復の試行の結果を返します。 App Protection CA を実装するアプリでは、これを処理する必要があります。 - 非決定的
MAM_ENROLLMENT_RESULT MAMEnrollmentNotification 登録試行の結果を返します。 すべてのアプリでこれを受け取ります。 - 非決定的
MANAGEMENT_REMOVED MAMUserNotification アプリが管理されようとしています。 MAMDataProtectionManagerを利用するアプリはこれを処理する必要があります。 以下 のMANAGEMENT_REMOVED を参照してください。 UI スレッドでは使用しない
REFRESH_APP_CONFIG MAMUserNotification アプリの構成値が変更されている可能性があります。 アプリ構成を実装し、アプリ構成データをキャッシュするアプリでは、これを処理する必要があります。 アプリは、キャッシュされたアプリ構成データを無効にして更新する必要があります。 非決定的
REFRESH_POLICY MAMUserNotification アプリ保護ポリシーが変更されている可能性があります。 アプリ保護ポリシーをキャッシュするアプリでは、これを処理する必要があります。 アプリは、キャッシュされたアプリ保護ポリシー データを無効にして更新する必要があります。 非決定的
WIPE_USER_DATA MAMUserNotification ワイプが発生しようとしています(*)。 MAMDataProtectionManagerを利用するアプリでは、このまたはWIPE_USER_AUXILIARY_DATAを処理する必要があります。 「選択的ワイプ」を参照してください。 UI スレッドでは使用しない
WIPE_USER_AUXILIARY_DATA MAMUserNotification ワイプが発生しようとしています(*)。 これを受け取るのはマルチ ID アプリのみです。
MAMDataProtectionManagerを利用するアプリでは、このまたはWIPE_USER_DATAを処理する必要があります。
「選択的ワイプ」を参照してください。 UI スレッドでは使用しない
WIPE_COMPLETED MAMUserNotification ワイプが完了しました。 常に省略可能。 WIPE_USER_DATAまたはWIPE_USER_AUXILIARY_DATA後に配信されます。 *アプリがハンドラーから WIPE_USER_DATA または WIPE_USER_AUXILIARY_DATAのエラーを報告した場合、この通知は送信されません。 UI スレッドでは使用しない

(*)ワイプは、次のようなさまざまな理由で発生する可能性があります。

  • unregisterAccountForMAM というアプリ。
  • IT 管理者がリモート ワイプを開始しました。
  • 管理者が必要とする条件付きアクセス ポリシーが満たされませんでした。

警告

アプリは、 WIPE_USER_DATA 通知と WIPE_USER_AUXILIARY_DATA 通知の両方に登録しないでください。

MANAGEMENT_REMOVED

MANAGEMENT_REMOVED通知は、以前にポリシーで管理されたアカウントが管理されようとしていることをアプリに通知します。 アカウントが管理されなくなると、アプリは、そのアカウントの暗号化されたファイルを読み取ったり、 MAMDataProtectionManagerで暗号化されたアカウントのデータを読み取ったり、暗号化されたクリップボードと対話したり、マネージド アプリ エコシステムに参加したりできなくなります。

これには、ユーザー データのワイプやユーザーのサインアウトは必要ありません (ワイプが必要な場合は、 WIPE_USER_DATA 通知が送信されます)。 多くのアプリではこの通知を処理する必要がない場合がありますが、 MAMDataProtectionManager を使用するアプリはこれを処理する必要があります。 詳細については、「 データ バッファー保護 」を参照してください。

SDK がアプリの MANAGEMENT_REMOVED レシーバーを呼び出すと、次のようになります。

  • SDK は、アプリに属する以前に暗号化されたファイル (ただし、保護されていないデータ バッファー) を既に暗号化解除しています。 アプリに直接属していない sdcard 上のパブリックな場所にあるファイル (ドキュメントやダウンロード フォルダーなど) は暗号化解除されません。

  • レシーバー メソッドによって作成された新しいファイルまたは保護されたデータ バッファー (またはレシーバーの起動後に実行されているその他のコード) は暗号化されません。

  • アプリは引き続き暗号化キーにアクセスできるため、データ バッファーの暗号化解除などの操作は成功します。

アプリのレシーバーが戻ると、暗号化キーにアクセスできなくなります。

MAMNotificationReceiver の実装

SDK からの通知に登録するには、アプリで MAMNotificationReceiver を作成し、MAMNotificationReceiverRegistry に登録 する必要があります。

受信側を登録するには、 registerReceiver をレシーバーに呼び出し、 Application.onCreate メソッドで目的の通知の種類を呼び出します。

@Override
public void onCreate() {
  super.onCreate();
  MAMComponents.get(MAMNotificationReceiverRegistry.class)
    .registerReceiver(
      new ToastNotificationReceiver(),
      MAMNotificationType.WIPE_USER_DATA);
}

アプリの MAMNotificationReceiver 実装には、 onReceive(MAMNotification notification) メソッドを含める必要があります。 このメソッドは、受信した通知ごとに個別に呼び出され、 booleanを返す必要があります。 通常、アプリケーションで通知に応答できない限り、このメソッドは常に trueを返す必要があります。

他の種類の Android レシーバーと同様に、アプリケーションには通知を処理する柔軟性があります。

  • 個別の通知の種類に対して 個別の MAMNotificationReceiver 実装を作成できます (以下で説明します)。 この場合は、各実装と各通知の種類を個別に登録してください。
  • 複数の異なる通知の種類に応答するためのロジックを含む 1 つの MAMNotificationReceiver 実装を使用できます。 この場合、応答できる通知の種類ごとに登録する必要があります。
  • それぞれ同じ通知の種類に応答する複数の MAMNotificationReceiver 実装を作成できます。 この場合、両方とも同じ通知の種類に登録する必要があります。

ヒント

コールバックが UI スレッドで実行されていないため、 MAMNotificationReceiver.onReceive でブロックしても安全です。

カスタム テーマ

カスタム テーマは、Intune App SDK に提供できます。このカスタム テーマは、すべての SDK 画面とダイアログに適用されます。 テーマが指定されていない場合は、既定の SDK テーマが使用されます。

カスタム テーマの提供

テーマを指定するには、 Application.onMAMCreate メソッドに次のコード行を追加する必要があります。

MAMThemeManager.setAppTheme(R.style.AppTheme);

上記の例では、 R.style.AppTheme を SDK に適用するスタイル テーマに置き換える必要があります。

信頼されたルート証明書の管理

アプリケーションで、内部 Web サイトとアプリケーションへの安全なアクセスを提供するために、オンプレミスまたはプライベート証明機関によって発行された SSL/TLS 証明書が必要な場合、Intune App SDK は、 API クラス MAMTrustedRootCertsManagerMAMCertTrustWebViewClient を使用した証明書信頼管理のサポートを追加しました。

注:

MAMCertTrustWebViewClient では 、Android 10 以降がサポートされています。

信頼されたルート証明書管理では、次のサポートが提供されます。

  • SSLContext
  • SSLSocketFactory
  • TrustManager
  • WebView

要件

注:

信頼されたルート証明書管理は、Microsoft Tunnel VPN Gateway とは別に使用できますが、使用するには Microsoft MAM Tunnel のライセンスを付与する必要があります。

Intune からの信頼されたルート証明書を使用したトラスト アンカーの確立

信頼されたルート証明書管理を使用すると、アプリで Intune からの信頼されたルート証明書をデバイスからの証明書と組み合わせて使用できます。

デバイスの信頼されたルート証明書ストアに、オンプレミス リソースへのセキュリティで保護された接続を確立するために必要な信頼されたルート証明書が含まれていない場合、API クラス MAMTrustedRootCertsManagerMAMCertTrustWebViewClient は、アプリ構成ポリシーを介して配信される Intune 信頼されたルート証明書をフォールバック オプションとして使用します。 これにより、アプリはデバイス証明書と Intune 証明書の両方を使用して、セキュリティで保護された接続と信頼されたソースとの通信を確認できます。

ネットワーク セキュリティ設定を強化するために、アプリはネットワーク セキュリティ構成 XML ファイルを使用できます。 信頼されたルート証明書管理は、アプリのネットワーク セキュリティ構成 XML に次のいずれかの機能があるかどうかを確認することで、この追加のセキュリティを尊重します。

  • 自己署名証明書などの追加の CA を含むカスタム信頼アンカー。
  • 信頼された CA を制限するためのドメイン固有の規則。
  • 特定のドメインの証明書のピン セット。

注:

Android ネットワーク セキュリティの構成の詳細については、「ネットワーク セキュリティの構成」を参照してください。

信頼が確認されているドメインに該当する場合、信頼されたルート証明書管理は、このドメインのカスタム信頼チェックをスキップし、プラットフォームの既定の信頼マネージャーのみがチェックを実行できるようにします。

MAMTrustedRootCertsManager クラス

このクラスには、次の API が用意されています。

  • createSSLContext(String identity, String protocol): 指定した ID と指定した SSL/TLS プロトコルに対して信頼されたルート証明書を使用する SSLContext オブジェクトを作成します。 このクラスから返された SSLContext オブジェクトは、デバイスと MAM サービスから結合された信頼されたルート証明書を使用する X509TrustManager オブジェクトで既に正しく初期化されています。
  • createSSLSocketFactory(String identity, String protocol): 指定した ID と指定した SSL/TLS プロトコルに対して信頼されたルート証明書を使用する SSLSocketFactory オブジェクトを作成します。 返された SSLSocketFactory オブジェクトは、このクラスの同じ SSLContext オブジェクトから参照されます。
  • createX509TrustManagers(String identity): デバイスからの信頼されたルート証明書と、指定した ID の MAM サービスを組み合わせて使用する X509TrustManager オブジェクトの配列を作成します。

注:

identity パラメーターは、UPN などのアプリケーションを実行している特定のユーザーの文字列識別子であることが想定されています。 ユーザー識別子が事前に不明な場合は、null の値を渡すことができます。MAM は、これらの API が呼び出されたスレッドまたはプロセスから正しい ID を検出しようとします。 MAM が ID を検出するには、プロセスまたはスレッドで ID を正しく設定する必要があります。 プロセスまたはスレッドでアクティブ ID を設定する方法の詳細については、「ステージ 5: マルチ ID」を参照してください。

注:

protocol パラメーターが指定されていない場合は、プラットフォームでサポートされている最も高い SSL/TLS プロトコルが使用されます。

このクラスの使用例を次に示します。

HttpsUrlConnection の使用例
// Create an SSL socket factory using supplying the optional parameters identity and protocol
SSLSocketFactory sslSocketFactory = MAMTrustedRootCertsManager.createSSLSocketFactory(identity, "TLSv1.3");

// Create a URL object for the desired endpoint
URL url = new URL("https://example.com");

// Open a connection using the URL object
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();

// Set the SSL socket factory for the connection
httpsURLConnection.setSSLSocketFactory(sslSocketFactory);

// Perform any other configuration or operations on the connection as needed
...
OkHttpClient の使用例
// Get the TrustManager instances for an identity from the SDK
TrustManager[] trustManagers = MAMTrustedRootCertsManager.createX509TrustManagers(identity);

// Get SSLContext from the platform
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");

// Initialize the SSLContext with the trust managers from the Intune App SDK
sslContext.init(null, trustManagers, null);  

// Create an OkHttpClient.Builder object
OkHttpClient.Builder builder = new OkHttpClient.Builder();

// Set the SSLSocketFactory and the trust managers from the SDK
builder.sslSocketFactory(sslContext.socketFactory, trustManagers[0] as X509TrustManager).build();

// Build an OkHttpClient object from the builder
OkHttpClient okHttpClient = builder.build();

// Create a Request object for the desired endpoint
Request request = new Request.Builder().url("https://example.com").build();

// Execute the request using the OkHttpClient object and get a Response object
Response response = okHttpClient.newCall(request).execute();

// Perform any other operations on the response as needed
...

MAMCertTrustWebViewClient クラス

このクラスは、WebViewの SSL エラー android.net.http.SslError.SSL_UNTRUSTEDを処理する方法を提供する Android クラス android.webkit.WebViewClientのカスタム実装を提供します。 このエラーの処理では、クラスは Intune で構成され、MAM サービスから受信した信頼されたルート証明書を使用して、 WebViewで SSL エラーを生成したターゲット URL からホストの信頼性を確認します。 カスタム実装で SSL エラーが処理されない場合は、スーパークラスから継承された既定の動作が呼び出されます。 このクラスを使用する場合は、そのクラスのインスタンスを作成し、 WebView.setWebViewClient(WebViewClient) を呼び出して WebView インスタンスに登録する必要があります。

このクラスの使用例を次に示します。

WebView の使用例
// Get the MAM implementation of WebViewClient from the Intune App SDK
MAMCertTrustWebViewClient mamCertTrustWebViewClient = new MAMCertTrustWebViewClient();

// Set the MAM WebViewClient from the SDK as the current handler on the instance of WebView
webView.setWebViewClient(mamCertTrustWebViewClient);

// Perform any other operations on WebView
...

終了条件

テストを容易にするために、 ポリシーを変更して迅速にテスト する方法に関するページを参照してください。

制限への保存と制限からのオープンの検証

アプリとデバイスまたはクラウドストレージの場所間のデータ転送を制限するためのポリシーを実装していない場合はスキップします。

アプリがクラウド サービスまたはローカル データにデータを保存し、クラウド サービスまたはローカル データからデータを開くことができるすべてのシナリオで、自分を参照します。

わかりやすくするために、これらのテストでは、アプリ内の 1 つの場所から OneDrive for Business のデータを保存して開くサポートのみがアプリに含まれていると想定されます。 ただし、すべての組み合わせを検証する必要があります。アプリでデータの保存が許可されているすべての場所に対してサポートされているすべての保存場所と、アプリでデータを開く場所に対してサポートされているすべての開いている場所を検証する必要があります。

これらのテストでは、アプリと Intune ポータル サイトをインストールします。テストを開始する前に、マネージド アカウントでログインします。 追加:

  • マネージド アカウントのポリシーを次のように設定します。
    • "組織データを他のアプリに送信する" を "ポリシー管理アプリ" に送信します。
    • "他のアプリからデータを受信する" から "ポリシー管理アプリ" に。
シナリオ 前提 条件 手順
に保存、完全に許可 "組織データのコピーを保存する" ポリシーが "許可" に設定されている - アプリが OneDrive for Business にデータを保存できる場所に移動します。
- アプリにログインしているのと同じマネージド アカウントに、OneDrive for Business にドキュメントを保存しようとします。
- 保存が許可されていることを確認します。
に保存し、除外する - "組織データのコピーを保存する" ポリシーが "ブロック" に設定されている
- "選択したサービスへのコピーの保存をユーザーに許可する" ポリシーが "OneDrive for Business" にのみ設定されている
- アプリが OneDrive for Business にデータを保存できる場所に移動します。
- アプリにログインしているのと同じマネージド アカウントに、OneDrive for Business にドキュメントを保存しようとします。
- 保存が許可されていることを確認します。
- アプリで許可されている場合は、ファイルを別のクラウド ストレージの場所に保存し、ブロックされていることを確認します。
に保存し、ブロックする "組織データのコピーを保存する" ポリシーが "ブロック" に設定されている - アプリが OneDrive for Business にデータを保存できる場所に移動します。
- アプリにログインしているのと同じマネージド アカウントに、OneDrive for Business にドキュメントを保存しようとします。
- 保存がブロックされていることを確認します。
- アプリで許可されている場合は、ファイルを別のクラウド ストレージの場所に保存し、ブロックされていることを確認します。
から開き、完全に許可 "組織ドキュメントにデータを開く" ポリシーが "許可" に設定されている - OneDrive for Business からアプリでデータを開くことができる場所に移動します。
- アプリのストレージにログインしているのと同じマネージド アカウントから、OneDrive for Business からドキュメントを開こうとします。
- オープンが許可されていることを確認します。
から開く、除外する - "組織ドキュメントにデータを開く" ポリシーが "ブロック" に設定されている
- "ユーザーが選択したサービスからデータを開くことを許可する" ポリシーが "OneDrive for Business" のみに設定されている
- OneDrive for Business からアプリでデータを開くことができる場所に移動します。
- アプリのストレージにログインしているのと同じマネージド アカウントから、OneDrive for Business からドキュメントを開こうとします。
- オープンが許可されていることを確認します。
- アプリで許可されている場合は、別のクラウド ストレージの場所から別のファイルを開き、ブロックされていることを確認します。
から開く、ブロックする "組織ドキュメントにデータを開く" ポリシーが "ブロック" に設定されている - OneDrive for Business からアプリでデータを開くことができる場所に移動します。
- アプリのストレージにログインしているのと同じマネージド アカウントから、OneDrive for Business からドキュメントを開こうとします。
- 開いているがブロックされていることを確認します。
- アプリで許可されている場合は、別のクラウド ストレージの場所から別のファイルを開き、ブロックされていることを確認します。

通知の制限の検証

通知内のコンテンツを制限するためのポリシーを実装していない場合はスキップします。

App Protection Policy に関する限り、アプリケーションで次の 3 種類の通知が発生する可能性があります。

  1. アカウント データを含まない通知。
  2. マネージド アカウントに属するデータを含む通知。
  3. アンマネージド アカウントに属するデータを含む通知。

アプリケーションが単一 ID の場合、唯一のアカウントが管理されていない場合は保護が適用されないので、最初の 2 つだけが関連します。

通知の制限は、異なるポリシー値が構成された 3 種類の通知をすべてトリガーすることで検証できます。

これらのテストでは、アプリと Intune ポータル サイトをインストールします。テストを開始する前に、マネージド アカウントでログインします。 アプリがマルチ ID の場合は、アンマネージド アカウントを使用してアプリにもログインします。

シナリオ 前提 条件 手順
完全なコンテンツがブロックされました "組織データ通知" ポリシーが "ブロック" に設定されている - アカウント データなしで通知を起動するようにアプリをトリガーします。
- この通知にコンテンツが表示されないようにします。
- アプリをトリガーして、マネージド アカウントのデータを使用して通知を起動します。
- この通知にコンテンツが表示されないようにします。
- アプリをトリガーして、アンマネージド アカウントのデータで通知を起動します。
- この通知にコンテンツが表示されないようにします。
部分的なコンテンツのブロック "組織データ通知" ポリシーが "組織データのブロック" に設定されている - アカウント データなしで通知を起動するようにアプリをトリガーします。
- この通知に完全なコンテンツが表示されていることを確認します。
- アプリをトリガーして、マネージド アカウントのデータを使用して通知を起動します。
- この通知によってマネージド アカウントのコンテンツが編集されていることを確認します。
- アプリをトリガーして、アンマネージド アカウントのデータで通知を起動します。
- この通知に完全なコンテンツが表示されていることを確認します。
コンテンツがブロックされていない "組織データ通知" ポリシーが "許可" に設定されている

データのバックアップと復元の検証

バックアップ データを保護するためのポリシーを実装していない場合はスキップします。

アプリがバックアップ用に構成したコンテンツ (ファイルやキーと値のペア) について理解し直してください。 予期されるコンテンツ のみが 復元の一部であることを検証する必要があります。 復元に余分なコンテンツが含まれると、データ リークが発生する可能性があります。

これらのテストでは、アプリと Intune ポータル サイトをインストールします。テストを開始する前に、マネージド アカウントでログインします。 アプリがマルチ ID の場合は、アンマネージド アカウントを使用してアプリにもログインします。

バックアップをテストするには、Android の公式の指示に従ってください。 これらの手順は、自動バックアップとキー/値のバックアップでは異なるため、密接に従ってください。

ポリシーに対するカスタム画面キャプチャの検証

カスタム画面キャプチャの制限を実装していない場合はスキップします。

アプリケーションに Android の Window レベルの FLAG_SECUREをバイパスする機能がある場合は、この機能がアプリ保護ポリシーの画面キャプチャ制限によってブロックされていることを検証します。

これらのテストでは、アプリと Intune ポータル サイトをインストールします。テストを開始する前に、マネージド アカウントでログインします。

シナリオ 前提 条件 手順
スクリーン キャプチャがブロックされました "スクリーン キャプチャと Google アシスタント" ポリシーが "ブロック" に設定されている - カスタム FLAG_SECURE コードを利用するアプリ内の場所に移動します。
- その機能の利用を試みます。
- 機能がブロックされていることを確認します。
許可された画面キャプチャ "スクリーン キャプチャと Google アシスタント" ポリシーが "許可" に設定されている - カスタム FLAG_SECURE コードを利用するアプリ内の場所に移動します。
- その機能の利用を試みます。
- 機能が許可されていることを確認します。

App Protection CA の検証

サポート アプリ保護 CA を実装していない場合はスキップします。

アプリ保護ポリシーを作成してアプリとテスト アカウントに割り当てる一般的な検証手順に加えて、アプリ保護条件付きアクセス ポリシーを作成してテスト アカウントに割り当てる必要もあります。 詳細については、「 Intune でアプリベースの条件付きアクセス ポリシーを設定する 」を参照してください。

テスト手順:

  1. このテストを開始する前に、Microsoft Authenticator と Intune ポータル サイトをアンインストールします。
  2. アプリをインストールします。
  3. アプリ保護ポリシーとアプリ ベースの CA ポリシーの両方を対象とするテスト アカウントでアプリにログインします。
  4. ポータル サイトのインストールを求めるメッセージがアプリに表示されていることを確認します。
  5. もう一度ログインします。
  6. デバイスの登録を求めるメッセージが表示されていることを確認します。 プロンプトに従います。 ここで登録を求めるメッセージが表示されない場合は、テスト デバイスが他の SDK 対応アプリ、ポータル サイト、Authenticator を最初にアンインストールしたことを確認します。 それでもプロンプトが表示されない場合は、上記の実装手順を見直してください。
  7. 登録後にすべてのアプリ データにアクセスできることを確認します。

通知レシーバーの検証

SDK からの通知の登録を実装していない場合はスキップします。

検証手順は、アプリが登録した通知の種類によって異なります。 すべての種類の通知に対してログ記録を追加して、受信者が適切に呼び出されていることを確認します。

MAM_ENROLLMENT_RESULT は、アプリ保護ポリシーを対象とするアカウントを使用してアプリケーションに最初にログインするだけでトリガーできます。

REFRESH_APP_CONFIG REFRESH_POLICYは、テスト アカウントを対象とするそれぞれのアプリ構成ポリシーとアプリ保護ポリシーを更新し、SDK が更新されたポリシーを受け取るのを待機することでトリガーできます。

ヒント

このプロセスを高速化するには、「 ポリシーの変更による迅速なテスト 」を参照してください。

MANAGEMENT_REMOVEDWIPE_USER_DATAWIPE_USER_AUXILIARY_DATAWIPE_COMPLETED 通知はすべて、Microsoft Intune から 選択的ワイプを発行 することでトリガーできます。

カスタム テーマの検証

カスタム テーマを実装していない場合はスキップします。

カスタム テーマのサポートは、SDK のダイアログで色を調べることで検証できます。 確認する最も簡単なダイアログは、MAM PIN 画面です。

前提 条件:

  • マネージド アカウントのポリシーを次のように設定します。
    • "アクセスの PIN" を "必須" に設定します。
  • アプリと Intune ポータル サイトをインストールします。

テスト手順:

  1. アプリケーションを起動し、テスト アカウントでログインします。
  2. MAM PIN 画面が表示され、SDK に指定したカスタム テーマに基づいてテーマが設定されていることを確認します。

次の手順

このガイドに従い、上記のすべての終了条件を完了した場合は、アプリが Intune App SDK と完全に統合され、アプリ保護ポリシーを適用できるようになりました。 前のアプリ参加セクション ( ステージ 5: マルチ IDステージ 6: アプリの構成) のいずれかをスキップし、アプリでこれらの機能をサポートする必要があるかどうかわからない場合は、 SDK 統合に関する重要な決定事項に関するページを参照してください。

アプリ保護は、アプリのコア シナリオになりました。 アプリの開発を続ける場合は、このガイドと 付録 を引き続き参照してください。