次の方法で共有


条件付きアクセス認証コンテキストに関する開発者ガイド

適用対象: 白いチェック マーク記号が付いた緑の円。 従業員テナント 灰色の X 記号が付いた白い円。 外部テナント (詳細はこちら)

条件付きアクセスは、あらゆるアプリ、つまり新旧、プライベート、パブリック、オンプレミス、マルチクラウドのアプリへのアクセスに対してポリシーを適用できるようにするゼロ トラスト コントロール プレーンです。 条件付きアクセス認証コンテキストを使用して、それらのアプリ内でさまざまなポリシーを適用できます。

条件付きアクセス認証コンテキスト (認証コンテキスト) を使用すると、アプリ レベルだけでなく、機密データとアクションに対して詳細なポリシーを適用できます。 ゼロ トラスト ポリシーを調整して、最小限の特権アクセスを実現しながら、ユーザーの摩擦を最小限に抑え、ユーザーの生産性とリソースの安全性を高めることができます。 現在、これは、OpenId Connect を使用するアプリケーションで利用され、高価値のトランザクションや従業員の個人データの表示など、機密性の高いリソースを保護するために会社で開発された認証用に使用されます。

アプリケーションとサービス内からステップアップ認証をトリガーするには、Microsoft Entra 条件付きアクセス エンジンの認証コンテキスト機能を使用します。 開発者は、アプリケーション内からエンド ユーザーに対して MFA などの強化された強力な認証を選択的に要求できるようになりました。 この機能により、開発者はアプリケーションのほとんどの部分でよりスムーズなユーザー エクスペリエンスを構築できるようになると同時に、より強力な認証制御に基づいて、より安全な操作やデータへのアクセスが保持されます。

問題の説明

IT 管理者と規制機関は、多くの場合、認証の追加要素とユーザーのプロンプトのバランスを取り、アプリケーションの適切なセキュリティとポリシーの準拠を実現することに苦労しています。 これは、ユーザーの生産性に影響を与える強力なポリシーか、機密性の高いリソースに対して十分な強度を持たないポリシーのどちらかを選択できます。

では、アプリで両方を組み合わせることができた場合はどうでしょうか。 セキュリティレベルが低く、ほとんどのシナリオでプロンプトが少ない機能。 その後、より機密性の高いデータにアクセスしているときに、条件付きでセキュリティ要件をステップアップしますか?

一般的なシナリオ

たとえば、ユーザーが多要素認証を使用して SharePoint にサインインできるときに、機密性の高いドキュメントを含む SharePoint のサイト コレクションへのアクセスには、準拠しているデバイスを使用する必要があり、かつ信頼できる IP 範囲からしかアクセスできないようにすることができます。

前提条件

最初に、認証と許可に OpenID Connect/ OAuth 2.0 プロトコルを使用して、アプリを Microsoft ID プラットフォームと統合する必要があります。 Microsoft ID プラットフォームの認証ライブラリを使用してアプリケーションを統合し、Microsoft Entra ID でセキュリティ保護することが推奨されます。 アプリと Microsoft ID プラットフォームの統合方法の学習は、Microsoft ID プラットフォームのドキュメントをお読みになることから始めることをお勧めします。 条件付きアクセス認証コンテキスト機能のサポートは、業界標準の OpenID Connect プロトコルによって提供されるプロトコル拡張機能に基づいて構築されています。 開発者は、条件付きアクセス認証コンテキスト参照クレーム要求パラメーターを使用して、アプリがポリシーをトリガーして満たすことができるようにします。

2 番目に条件付きアクセスでは、Microsoft Entra ID P1 ライセンスが必要になります。 ライセンスの詳細については、Microsoft Entra の価格に関するページを参照してください。

3 番目に、現時点では、ユーザーがサインインするアプリケーションでのみ使用できます。 それ自体として認証されるアプリケーションはサポートされていません。 Microsoft ID プラットフォームでサポートされている認証アプリの種類とフローについては、「認証フローとアプリケーションのシナリオ」ガイドを参照してください。

統合手順

サポートされている認証プロトコルを使用して統合され、条件付きアクセス機能を使用できる Microsoft Entra テナントに登録されると、この機能をアプリケーションに統合できます。

Note

この機能の詳細なチュートリアルは、Use Conditional Access Auth Context in your app for step-up authentication の録画されたセッションでも参照できます。

最初に、認証コンテキストを宣言し、テナントで使用できるようにします。 詳しくは、認証コンテキストの構成に関する記事をご覧ください。

テナントの認証コンテキスト ID として値 C1 から C99 を使用できます。 認証コンテキストの例を次に示します。

  • C1 - 強力な認証が必要
  • C2 – 準拠しているデバイスが必須
  • C3 – 信頼できる場所が必要

条件付きアクセス認証コンテキストを使用するには、条件付きアクセス ポリシーを作成または変更します。 ポリシーの例を次に示します。

  • この Web アプリケーションにサインインするすべてのユーザーは、認証コンテキスト ID C1 の 2FA を正常に完了する必要があります。
  • この Web アプリケーションにサインインするすべてのユーザーは、2FA を正常に完了し、認証コンテキスト ID C3 の定義済みの IP アドレス範囲からアプリにアクセスする必要があります。

Note

条件付きアクセス認証コンテキストの値は、アプリケーションとは別に宣言および管理されます。 アプリケーションが認証コンテキスト ID に強く依存することは推奨されません。 IT 管理者は通常、利用可能なリソースについて理解を深めるので、条件付きアクセス ポリシーを作成します。 同様に、アプリケーションが複数のテナントで使用されている場合、使用される認証コンテキスト ID は異なる可能性があり、場合によっては、まったく使用できない場合もあります。

2 番目: 条件付きアクセス認証コンテキストを使用する予定のアプリケーションの開発者は、まず、アプリケーション管理者または IT 管理者に、潜在的に機密性の高いアクションを認証コンテキスト ID にマップする方法を提供することをお勧めします。 手順は大まかに次のとおりです。

  1. 認証コンテキスト ID にマップすることができるコード内のアクションを識別します。
  2. IT 管理者が、機密性の高いアクションを使用可能な認証コンテキスト ID にマップするために使用できる、アプリの管理ポータル内の画面 (または同等の機能) を作成します。
  3. コード サンプル「 条件付きアクセス認証コンテキストを使用してステップアップ認証を実行する 」を参照してください。

以下の手順は、コード ベースで実行する必要がある変更です。 これらの手順は、大まかに以下で構成されています。

  • MS Graph にクエリを実行して、使用可能なすべての認証コンテキスト を一覧表示します
  • IT 管理者が機密性が高く、高い特権を持つ操作を選択し、使用可能な認証コンテキストに対して条件付きアクセス ポリシーを使用してそれらを割り当てることができるようにします。
  • このマッピング情報をデータベースまたはローカル ストアに保存します。

認証コンテキストを作成するためのセットアップ フロー

3 番目: アプリケーション (この例では、Web API を想定します) では、保存されたマッピングに対して呼び出しを評価し、その結果に応じて、クライアント アプリの要求チャレンジを発生させる必要があります。 このアクションを準備するには、次の手順を実行します。

  1. 機密性が高く、認証コンテキストによって保護されている操作の場合は、前に保存した認証コンテキスト ID マッピングに対して acrs 要求の値を評価し、次のコード スニペットに示すクレーム チャレンジを発生させます。

  2. 次の図は、ユーザー、クライアント アプリ、Web API の間の相互作用を示しています。

    ユーザー、Web アプリ、API、Microsoft Entra ID の相互作用を示す図

    次のコード スニペットは、条件付きアクセス認証コンテキストを使用したステップアップ認証の実行に関するページのコード サンプルです。 API の最初のメソッド CheckForRequiredAuthContext() は、以下を実行します。

    • 呼び出されているアプリケーションのアクションにステップアップ認証が必要かどうかを確認します。 そのために、このメソッド用に保存されたマッピングがデータベースにあるかどうかを確認します。
    • このアクションで昇格された認証コンテキストが実際に必要な場合は、既存の一致する認証コンテキスト ID があるか acrs 要求を確認します。
    • 一致する認証コンテキスト ID が見つからない場合は、クレーム チャレンジが発生します。
    public void CheckForRequiredAuthContext(string method)
    {
        string authType = _commonDBContext.AuthContext.FirstOrDefault(x => x.Operation == method
                    && x.TenantId == _configuration["AzureAD:TenantId"])?.AuthContextId;
    
        if (!string.IsNullOrEmpty(authType))
        {
            HttpContext context = this.HttpContext;
            string authenticationContextClassReferencesClaim = "acrs";
    
            if (context == null || context.User == null || context.User.Claims == null
                || !context.User.Claims.Any())
            {
                throw new ArgumentNullException("No Usercontext is available to pick claims from");
            }
    
            Claim acrsClaim = context.User.FindAll(authenticationContextClassReferencesClaim).FirstOrDefault(x
                => x.Value == authType);
    
            if (acrsClaim == null || acrsClaim.Value != authType)
            {
                if (IsClientCapableofClaimsChallenge(context))
                {
                    string clientId = _configuration.GetSection("AzureAd").GetSection("ClientId").Value;
                    var base64str = Convert.ToBase64String(Encoding.UTF8.GetBytes("{\"access_token\":{\"acrs\":{\"essential\":true,\"value\":\"" + authType + "\"}}}"));
    
                    context.Response.Headers.Append("WWW-Authenticate", $"Bearer realm=\"\", authorization_uri=\"https://login.microsoftonline.com/common/oauth2/authorize\", client_id=\"" + clientId + "\", error=\"insufficient_claims\", claims=\"" + base64str + "\", cc_type=\"authcontext\"");
                    context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                    string message = string.Format(CultureInfo.InvariantCulture, "The presented access tokens had insufficient claims. Please request for claims requested in the WWW-Authentication header and try again.");
                    context.Response.WriteAsync(message);
                    context.Response.CompleteAsync();
                    throw new UnauthorizedAccessException(message);
                }
                else
                {
                    throw new UnauthorizedAccessException("The caller does not meet the authentication  bar to carry our this operation. The service cannot allow this operation");
                }
            }
        }
    }
    

    Note

    クレーム チャレンジの形式については、Microsoft ID プラットフォームのクレーム チャレンジに関する記事で説明しています。

  3. クライアント アプリケーションで、クレーム チャレンジをインターセプトし、ユーザーを Microsoft Entra ID に再度リダイレクトして、さらにポリシーを評価します。 次のコード スニペットは、条件付きアクセス認証コンテキストを使用したステップアップ認証の実行に関するページのコード サンプルです。

    internal static string ExtractHeaderValues(WebApiMsalUiRequiredException response)
    {
        if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized && response.Headers.WwwAuthenticate.Any())
        {
            AuthenticationHeaderValue bearer = response.Headers.WwwAuthenticate.First(v => v.Scheme == "Bearer");
            IEnumerable<string> parameters = bearer.Parameter.Split(',').Select(v => v.Trim()).ToList();
            var errorValue = GetParameterValue(parameters, "error");
    
            try
            {
                // read the header and checks if it contains error with insufficient_claims value.
                if (null != errorValue && "insufficient_claims" == errorValue)
                {
                    var claimChallengeParameter = GetParameterValue(parameters, "claims");
                    if (null != claimChallengeParameter)
                    {
                        var claimChallenge = ConvertBase64String(claimChallengeParameter);
    
                        return claimChallenge;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        return null;
    }
    

    Web API の呼び出しで例外を処理します。クレーム チャレンジが提示された場合、ユーザーを再び Microsoft Entra ID にリダイレクトして、さらに処理を行います。

    try
    {
        // Call the API
        await _todoListService.AddAsync(todo);
    }
    catch (WebApiMsalUiRequiredException hex)
    {
        // Challenges the user if exception is thrown from Web API.
        try
        {
            var claimChallenge =ExtractHeaderValues(hex);
            _consentHandler.ChallengeUser(new string[] { "user.read" }, claimChallenge);
    
            return new EmptyResult();
        }
        catch (Exception ex)
        {
            _consentHandler.HandleException(ex);
        }
    
        Console.WriteLine(hex.Message);
    }
    return RedirectToAction("Index");
    
  4. (省略可能) クライアントの機能を宣言します。 クライアント機能は、Web API などのリソース プロバイダー (RP) が、クライアント アプリケーションが要求の課題を理解しているかどうかを検出し、それに応じて応答をカスタマイズするのに役立ちます。 この機能は、すべての API クライアントがクレーム チャレンジを処理できるわけではなく、以前の一部のクライアントでは依然として別の応答が必要になる場合に便利であることがあります。 詳細については、「クライアント機能」のセクションを参照してください。

注意事項とレコメンデーション

アプリで認証コンテキストの値をハードコーディングしないでください。 アプリは、MS Graph 呼び出しを使用して、認証コンテキストの読み取りと適用を行う必要があります。 この方法は、マルチテナント アプリケーションの場合に重要になります。 認証コンテキストの値は Microsoft Entra テナントによって異なり、Microsoft Entra ID Free エディションでは使用できません。 アプリがコードで認証コンテキストのクエリ、設定、使用を行う方法の詳細については、「 条件付きアクセス認証コンテキストを使用してステップアップ認証を実行する」コード サンプルを参照してください。

アプリ自体が条件付きアクセス ポリシーのターゲットになる場合には認証コンテキストを使用しないでください。 この機能は、アプリケーションの一部で、ユーザーが高いレベルの認証を満たす必要がある場合に最適です。

コード サンプル

条件付きアクセスの想定される動作における認証コンテキスト [ACR]

要求における認証コンテキストの明示的な充足

クライアントは、要求本文の要求を通じて、認証コンテキスト (ACRS) を持つトークンを明示的に要求できます。 ACRS が要求された場合、条件付きアクセスでは、すべてのチャレンジが完了した場合に、要求された ACRS でトークンを発行できます。

テナントの条件付きアクセスによって認証コンテキストが保護されていない場合の想定される動作

条件付きアクセスは、ACRS 値に割り当てられているすべての条件付きアクセス ポリシーが満たされている場合に、トークンの要求で ACRS を発行できます。 条件付きアクセス ポリシーが ACRS 値に割り当てられていない場合でも、すべてのポリシー要件が満たされているため、要求が発行される可能性があります。

ACRS が明示的に要求された場合に想定される動作の概要表

ACRS の要求 ポリシーの適用 制御が満たされているか 要求に ACRS が追加されたか
あり いいえ あり あり
あり あり いいえ いいえ
あり あり あり あり
あり ACRS で構成されたポリシーはない あり あり

日和見的な評価による暗黙的な認証コンテキストの充足

リソース プロバイダーは、オプションの "acrs" 要求をオプトインできます。 条件付きアクセスは、Microsoft Entra ID への新しいトークンを取得するためのラウンド トリップを回避するために、日和見的に ACRS をトークン要求に追加しようと試みます。 この評価では、条件付きアクセスによって認証コンテキストのチャレンジを保護するポリシーが既に満たされているかどうかの確認が行われ、満たされている場合はトークン要求に ACRS が追加されます。

Note

各トークンの種類は、個別にオプトインする必要があります (ID トークン、アクセス トークン)。

リソース プロバイダーがオプションの "acrs" 要求をオプトインしない場合、トークンで ACRS を取得する唯一の方法は、トークン要求で明示的に要求することです。 日和見評価の利点は得られません。そのため、必要な ACRS がトークン要求から欠落するたびに、リソース プロバイダーは要求に含まれる新しいトークンを取得するようクライアントに要求します。

暗黙的な ACRS の日和見的な評価における認証コンテキストとセッション制御で想定される動作

サインイン頻度 (間隔別)

条件付きアクセスは、現在存在するすべての認証要素の認証インスタンスがサインイン頻度の間隔に収まっている場合、ACRS の日和見的な評価における「サインイン頻度 (間隔別)」が満たされていると見なします。 いずれかの認証要素が古い場合、間隔によるサインイン頻度は満たされておらず、ACRS は日和見的にトークンで発行されません。

Cloud App Security (CAS)

条件付きアクセスでは、その要求中に CAS セッションが確立された場合、CAS セッション制御は日和見的 ACRS 評価に対して満たされていると見なされます。 たとえば、ある要求が届き、これに何らかの条件付きアクセス ポリシーが適用されて CAS セッションが強制され、さらに CAS セッションを要求する条件付きアクセス ポリシーがあった場合、CAS セッションが強制されるため、日和見的な評価の CAS セッション制御は満たされることになります。

テナントに認証コンテキストを保護する条件付きアクセス ポリシーが含まれている場合の想定される動作

次の表は、ACRS がオポチュニスティック評価によってトークンのクレームに追加されるすべてのコーナーケースを示しています。

ポリシー A: "c1" acrs を要求する際に、ユーザー "Ariel" を除くすべてのユーザーから MFA を要求します。 ポリシー B: "c2" または "c3" acrs を要求する際に、ユーザー "Jay" を除くすべてのユーザーをブロックします。

Flow ACRS の要求 ポリシーの適用 制御が満たされているか 要求に ACRS が追加されたか
Ariel がアクセス トークンを要求する "c1" None はい ("c1" の場合)。 いいえ ("c2" と "c3" の場合) "c1" (要求済み)
Ariel がアクセス トークンを要求する "c2" ポリシー B ポリシー B によってブロックされる None
Ariel がアクセス トークンを要求する None None はい ("c1" の場合)。 いいえ ("c2" と "c3" の場合) "c1" (ポリシー A から日和見的に追加)
Jay がアクセス トークンを要求する (MFA なし) "c1" ポリシー A いいえ None
Jay がアクセス トークンを要求する (MFA あり) "c1" ポリシー A あり "c1" (要求済み)、"c2" (ポリシー B から日和見的に追加)、"c3" (ポリシー B から日和見的に追加)
Jay がアクセス トークンを要求する (MFA なし) "c2" None はい ("c2" と "c3" の場合)。 いいえ ("c1" の場合) "c2" (要求済み)、"c3" (ポリシー B から日和見的に追加)
Jay がアクセス トークンを要求する (MFA あり) "c2" None はい ("c1"、"c2"、"c3" の場合) "c1" (A からのベスト エフォート)、"c2" (要求済み)、"c3" (ポリシー B から日和見的に追加)
Jay がアクセス トークンを要求する (MFA あり) None None はい ("c1"、"c2"、"c3" の場合) "c1"、"c2"、"c3" がすべて日和見的に追加
Jay がアクセス トークンを要求する (MFA なし) None None はい ("c2" と "c3" の場合)。 いいえ ("c1" の場合) "c2"、"c3" がすべて日和見的に追加

次のステップ