Intune App SDK for iOS - App Protection CA のサポート (省略可能)

アプリ保護の条件付きアクセスは、Intune がアプリ保護ポリシーが適用されていることを確認するまで、サーバー トークンへのアクセスをブロックします。 この機能では、追加ユーザー フローを変更する必要があります。 お客様が App Protection CA を有効にすると、保護されたリソースにアクセスする顧客のテナント内のアプリケーションは、この機能をサポートしていない限り、アクセス トークンを取得できません。

注:

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

ステージ 6: App Protection CA のサポート

ステージの目標

  • iOS アプリ内の App Protection 条件付きアクセスをサポートするために使用できるさまざまな API について説明します
  • アプリとユーザーに App Protection 条件付きアクセスを統合します。
  • アプリとユーザーとの上記の統合をテストします。

依存関係

Intune SDK に加えて、アプリで App Protection CA を有効にするには、これら 2 つのコンポーネントが必要です。

  1. iOS Authenticator アプリ
  2. MSAL 認証ライブラリ 1.0 以降

MAM-CA 修復フロー

MAM-CA 修復フローの図。

新しい API

新しい API のほとんどは、IntuneMAMComplianceManager.h にあります。 アプリは、以下で説明する 3 つの動作の違いを認識する必要があります。

新しい動作 説明
アプリ → ADAL/MSAL: トークンの取得 アプリケーションがトークンを取得しようとすると、ERROR_SERVER_PROTECTION_POLICY_REQUIREDを受け取る準備が整う必要があります。 アプリは、初期アカウントの追加フロー中、またはアプリケーション ライフサイクルの後半でトークンにアクセスするときに、このエラーを受け取ることができます。 アプリがこのエラーを受け取ると、アクセス トークンは付与されないため、サーバー データを取得するために修復する必要があります。
アプリ → Intune SDK: 呼び出し修復ComplianceForIdentity アプリが ADAL または MSALErrorServerProtectionPoliciesRequired からERROR_SERVER_PROTECTION_POLICY_REQUIREDを受信すると、[[IntuneMAMComplianceManager instance] remediateComplianceForIdentity] を呼び出して、Intune でアプリを登録してポリシーを適用できるようにする必要があります。 この呼び出し中にアプリが再起動される場合があります。 アプリを再起動する前に状態を保存する必要がある場合は、IntuneMAMPolicyDelegate の restartApplication デリゲート メソッドで保存できます。

remediateComplianceForIdentity には、registerAndEnrollAccount と loginAndEnrollAccount のすべての機能が用意されています。 そのため、アプリは、これらの古い API のいずれかを使用する必要はありません。
Intune → アプリ: 修復通知を委任する Intune がポリシーを取得して適用すると、IntuneMAMComplianceDelegate プロトコルを使用して結果がアプリに通知されます。 アプリで各エラーを処理する方法については、「IntuneComplianceManager.h の IntuneMAMComplianceStatus」を参照してください。 IntuneMAMComplianceCompliant を除くすべてのケースで、ユーザーは有効なアクセス トークンを持ちません。

アプリに既に管理コンテンツがあり、準拠状態を入力できない場合、アプリケーションは選択的ワイプを呼び出して企業コンテンツを削除する必要があります。

準拠状態に到達できない場合は、アプリにローカライズされたエラー メッセージと、withErrorMessage と andErrorTitle によって提供されるタイトル文字列が表示されます。

IntuneMAMComplianceDelegate の hasComplianceStatus メソッドの例

(void) accountId:(NSString*_Nonnull) accountId hasComplianceStatus:(IntuneMAMComplianceStatus) status withErrorMessage:(NSString*_Nonnull) errMsg andErrorTitle:(NSString*_Nonnull) errTitle
{
    switch(status)
    {
        case IntuneMAMComplianceCompliant:
        {
            /*
            Handle successful compliance
            */
            break;
        }
        case IntuneMAMComplianceNotCompliant:
        case IntuneMAMComplianceNetworkFailure:
        case IntuneMAMComplianceUserCancelled:
        case IntuneMAMComplianceServiceFailure:
        {
            UIAlertController* alert = [UIAlertController alertControllerWithTitle:errTitle
            message:errMsg
            preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
            handler:^(UIAlertAction * action) {exit(0);}];
            [alert addAction:defaultAction];
            dispatch_async(dispatch_get_main_queue(), ^{
            [self presentViewController:alert animated:YES completion:nil];
            });
            break;
        }
        case IntuneMAMComplianceInteractionRequired:
        {
            [[IntuneMAMComplianceManager instance] remediateComplianceForAccountId:accountId silent:NO];
            break;
        }
    }
}
func accountId(_ accountId: String, hasComplianceStatus status: IntuneMAMComplianceStatus, withErrorMessage errMsg: String, andErrorTitle errTitle: String) {
        switch status {
        case .compliant:
           //Handle successful compliance
        case .notCompliant, .networkFailure,.serviceFailure,.userCancelled:
            DispatchQueue.main.async {
              let alert = UIAlertController(title: errTitle, message: errMsg, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
                    exit(0)
                })) 
                self.present(alert, animated: true, completion: nil) 
            }
        case .interactionRequired:
            IntuneMAMComplianceManager.instance().remediateCompliance(forAccountId: accountId, silent: false)
   }

MSAL/ADAL

アプリは、クライアント機能変数を MSAL/ADAL 構成に追加することで、App Protection CA のサポートを示す必要があります。 次の値が必要です: claims = {"access_token":{"xms_cc":{"values":["protapp"]}}}

MSALPublicClientApplicationConfig クラス リファレンス (azuread.github.io)

    MSALAADAuthority *authority = [[MSALAADAuthority alloc] initWithURL:[[NSURL alloc] initWithString:IntuneMAMSettings.aadAuthorityUriOverride] error:&msalError];
    MSALPublicClientApplicationConfig *config = [[MSALPublicClientApplicationConfig alloc]
                                                 initWithClientId:IntuneMAMSettings.aadClientIdOverride
                                                 redirectUri:IntuneMAMSettings.aadRedirectUriOverride
                                                 authority:authority];

    /*
     IF YOU'RE IMPLEMENTING CA IN YOUR APP, PLEASE PAY ATTENTION TO THE FOLLOWING...
    */
    // This is needed for CA!
    // This line adds an option to the MSAL token request so that MSAL knows that CA may be active
    // Without this, MSAL won't know that CA could be activated
    // In the event that CA is activated and this line isn't in place, the auth flow will fail

    config.clientApplicationCapabilities = @[@"protapp"];
guard let authorityURL = URL(string: kAuthority) else {
            print("Unable to create authority URL")
            return
        }
         let authority = try MSALAADAuthority(url: authorityURL)
         let msalConfiguration = MSALPublicClientApplicationConfig(clientId: kClientID,redirectUri: kRedirectUri,
                                                                  authority: authority)
        msalConfiguration.clientApplicationCapabilities = ["ProtApp"]
        self.applicationContext = try MSALPublicClientApplication(configuration: msalConfiguration)

MAM SDK コンプライアンス修復 API の accountId パラメーターの Entra オブジェクト ID を取得するには、次の操作を行う必要があります。

  • まず、アプリにERROR_SERVER_PROTECTION_POLICY_REQUIREDを報告するときに MSAL によって送信される MSALError オブジェクト内の userInfo[MSALHomeAccountIdKey] から homeAccountId を取得します。
  • この homeAccountId は ObjectId.TenantId という形式になります。 '.' の文字列を分割して ObjectId 値を抽出し、修復 API remediateComplianceForAccountId の accountId パラメーターにその値を使用します。

終了条件

App Protection CA のテスト ユーザーの構成

  1. 管理者の資格情報を使用してログインし、 https://portal.azure.comします。
  2. [ Microsoft Entra ID>Security>Conditional Access>New policy] を選択します。 新しい条件付きアクセス ポリシーを作成します。
  3. 次の項目を設定して、条件付きアクセス ポリシーを構成します。
    • [名前] フィールドに入力します。
    • ポリシーの有効化。
    • ユーザーまたはグループにポリシーを割り当てる。
  4. クラウド アプリを割り当てます。 [ インクルード>すべてのクラウド アプリ] を選択します。 警告の注意事項として、この設定を誤って構成しないように注意してください。 たとえば、すべてのクラウド アプリを除外した場合は、本体からロックアウトします。
  5. アクセス制御>Grant Access>Require アプリ保護ポリシーを選択して、アクセス制御を付与します。
  6. ポリシーの構成が完了したら、[ 作成 ] を選択してポリシーを保存して適用します。
  7. ポリシーを有効にします。
  8. また、ユーザーが MAM ポリシーの対象になっていることを確認する必要もあります。

テスト_ケース

試金石 テスト方法 予想される結果
MAM-CA は常に適用されます アプリに登録する前に、ユーザーが App Protection CA と MAM ポリシーの両方を対象にしていることを確認します。 アプリが上記の修復ケースを処理し、アプリがアクセス トークンを取得できることを確認します。
ユーザーの登録後に適用される MAM-CA ユーザーは既にアプリにログインする必要がありますが、App Protection CA を対象としていません。 コンソールで App Protection CA のユーザーをターゲットにし、MAM 修復が正しく処理されていることを確認します
MAM-CA 非準拠 App Protection CA ポリシーを設定しますが、MAM ポリシーは割り当てないでください。 ユーザーはアクセス トークンを取得できません。 これは、アプリが IntuneMAMComplianceStatus エラー ケースを処理する方法をテストする場合に役立ちます。

次の手順

上記のすべての 終了条件 を完了すると、アプリは App Protection CA サポートと正常に統合されます。 以降のセクション 「ステージ 7: Web ビュー機能」は、アプリの目的のアプリ保護ポリシーのサポートに応じて、必要な場合と必要ない場合があります。