継続的アクセス評価が有効になった API をアプリケーションで使用する方法

継続的アクセス評価 (CAE) は、有効期間をベースとしたトークンの失効に頼るのではなく、クリティカル イベントポリシー評価に基づいてアクセス トークンを取り消すことができる Microsoft Entra 機能です。

リスクとポリシーはリアルタイムで評価されるため、一部のリソース API のトークンの有効期間は最大で 28 時間延長される可能性があります。 このような有効期間が長いトークンは、Microsoft Authentication Library (MSAL) によって事前に更新されるため、アプリケーションの回復性が向上します。

MSAL を使用していないアプリケーションでは、CAE を使用するための 要求のチャレンジ、要求要求、およびクライアント機能 のサポートを追加できます。

実装時の注意事項

CAE を使用するには、アプリもそれがアクセスするリソース API も CAE 対応であることが必要です。 リソース API によって CAE が実装されていて、CAE を処理できることがご利用のアプリケーションで宣言されている場合、アプリは、そのリソースに対する CAE トークンを受信します。 このため、アプリが CAE 対応であることを宣言する場合、アプリケーションは、Microsoft Identity アクセス トークンを受け入れるすべてのリソース API の CAE 要求チャレンジを処理する必要があります。

ただし、CAE 対応リソースをサポートするようにコードを準備しても、CAE をサポートしていない API を操作する機能が制限されるわけではありません。 アプリが CAE 応答を正しく処理しない場合、技術的には有効でも CAE が原因で取り消されるトークンを使用する API 呼び出しをアプリが繰り返し再試行する可能性があります。

アプリケーション内での CAE の処理

まずは、CAE が原因で呼び出しを拒否しているリソース API からの応答を処理するコードを追加します。 CAE では、アクセス トークンが取り消されているとき、または API が使用されている IP アドレスの変更を検出すると、API は 401 状態と WWW-Authenticate ヘッダーを返します。 この WWW-Authenticate ヘッダーには、アプリケーションが新しいアクセス トークンを取得するために使用できる要求チャレンジが含まれています。

次に例を示します。

// Line breaks for legibility only

HTTP 401; Unauthorized

Bearer authorization_uri="https://login.windows.net/common/oauth2/authorize",
  error="insufficient_claims",
  claims="eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTYwNDEwNjY1MSJ9fX0="

アプリは以下がないかを確認します。

  • 401 状態を返す API 呼び出し
  • 以下を含む WWW-Authenticate ヘッダーの存在。
    • error という値を持つ insufficient_claims パラメーター
    • claims パラメーター

これらの条件が満たされると、アプリは MSAL.NETWwwAuthenticateParameters クラスを使用して、要求チャレンジを抽出してデコードすることができます。

if (APIresponse.IsSuccessStatusCode)
{
    // ...
}
else
{
    if (APIresponse.StatusCode == System.Net.HttpStatusCode.Unauthorized
        && APIresponse.Headers.WwwAuthenticate.Any())
    {
        string claimChallenge = WwwAuthenticateParameters.GetClaimChallengeFromResponseHeaders(APIresponse.Headers);

アプリは次に、要求チャレンジを使用して、リソースの新しいアクセス トークンを取得します。

try
{
    authResult = await _clientApp.AcquireTokenSilent(scopes, firstAccount)
        .WithClaims(claimChallenge)
        .ExecuteAsync()
        .ConfigureAwait(false);
}
catch (MsalUiRequiredException)
{
    try
    {
        authResult = await _clientApp.AcquireTokenInteractive(scopes)
            .WithClaims(claimChallenge)
            .WithAccount(firstAccount)
            .ExecuteAsync()
            .ConfigureAwait(false);
    }
    // ...

アプリケーションで CAE 対応リソースから返された要求チャレンジを処理する準備ができたら、アプリが CAE 対応であることを Microsoft Identity に伝えることができます。 これを MSAL アプリケーション内で行うには、"cp1" というクライアント機能を使用してパブリック クライアントを構築します。

_clientApp = PublicClientApplicationBuilder.Create(App.ClientId)
    .WithDefaultRedirectUri()
    .WithAuthority(authority)
    .WithClientCapabilities(new [] {"cp1"})
    .Build();

ユーザーをサインインさせてから、Azure portal を使用してユーザーのセッションを取り消すことで、アプリケーションをテストできます。 CAE 対応の API が次にアプリで呼び出されたとき、ユーザーは再認証を行うように求められます。

コード サンプル