次の方法で共有


Azure App Service 認証でユーザー ID を操作する

この記事では、Azure App Service で 組み込みの認証と承認 を使用する場合に、ユーザー ID を操作する方法について説明します。

[前提条件]

App Service の認証および承認モジュールが有効になっている Azure App Service で実行されている Web アプリケーション。

アプリ コードでユーザー クレームにアクセスする

アプリの認証されたエンド ユーザーまたはクライアント アプリケーションは、受信トークンで要求を行います。 App Service は、クレームを要求ヘッダーに注入して、コードで使用できるようにします。 外部要求は、これらのヘッダーの設定を許可されていないため、App Service によって設定された場合にのみ存在します。

App Service 認証で提供される要求情報を使用して、アプリ コードで承認チェックを実行できます。 任意の言語またはフレームワークのコードは、要求ヘッダーから必要な情報を取得できます。 一部のコード フレームワークには、より便利な追加オプションが用意されています。 フレームワーク固有の代替手段を参照してください。

次の表に、ヘッダーの例をいくつか示します。

ヘッダ 説明
X-MS-CLIENT-PRINCIPAL Base64 でエンコードされた使用可能な要求の JSON 表現。 詳細については、「 クライアント プリンシパル ヘッダーのデコード」を参照してください。
X-MS-CLIENT-PRINCIPAL-ID ID プロバイダーが呼び出し元に設定する識別子。
X-MS-CLIENT-PRINCIPAL-NAME 電子メール アドレスやユーザー プリンシパル名など、ID プロバイダーが呼び出し元に設定する人間が判読できる名前。
X-MS-CLIENT-PRINCIPAL-IDP App Service 認証で使用される ID プロバイダーの名前。

同様のヘッダーは 、プロバイダー トークンを公開します。 たとえば、Microsoft Entra では、必要に応じて X-MS-TOKEN-AAD-ACCESS-TOKEN および X-MS-TOKEN-AAD-ID-TOKEN プロバイダー トークン ヘッダーを設定します。

App Service は、要求ヘッダーをすべての言語フレームワークで使用できるようにします。 これらのヘッダーは、異なる言語フレームワークでは異なる形式 (小文字や先頭文字が大文字など) でアプリ コードに提供される可能性があります。

クライアント プリンシパル ヘッダーをデコードする

X-MS-CLIENT-PRINCIPAL ヘッダーには、Base64 でエンコードされた JSON で使用可能な要求の完全なセットが含まれています。 このヘッダーを処理するには、アプリでペイロードをデコードし、 claims 配列を反復処理して関連する要求を見つける必要があります。

これらの要求には既定の要求マッピング プロセスが適用されるため、一部の名前はトークンに表示される名前とは異なる場合があります。

デコードされたペイロード構造は次のとおりです。

{
    "auth_typ": "",
    "claims": [
        {
            "typ": "",
            "val": ""
        }
    ],
    "name_typ": "",
    "role_typ": ""
}

次の表では、プロパティについて説明します。

プロパティ タイプ 説明
auth_typ 文字列 App Service 認証で使用される ID プロバイダーの名前。
claims アレイ 使用可能な要求を表すオブジェクトの配列。 各オブジェクトには、typ および val プロパティが含まれています。
typ 文字列 要求の名前。既定の要求マッピングの対象となり、トークン内の対応する要求とは異なる場合があります。
val 文字列 要求の値。
name_typ 文字列 名前要求の種類。これは通常、 name 要求が定義されている場合にスキーム情報を提供する URI です。
role_typ 文字列 ロール要求の種類。これは通常、 role 要求が定義されている場合にスキーム情報を提供する URI です。

便宜上、要求をアプリの言語フレームワークで使用される表現に変換できます。 次の C# の例では、アプリで使用する ClaimsPrincipal 型を構築します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http;

public static class ClaimsPrincipalParser
{
    private class ClientPrincipalClaim
    {
        [JsonPropertyName("typ")]
        public string Type { get; set; }
        [JsonPropertyName("val")]
        public string Value { get; set; }
    }

    private class ClientPrincipal
    {
        [JsonPropertyName("auth_typ")]
        public string IdentityProvider { get; set; }
        [JsonPropertyName("name_typ")]
        public string NameClaimType { get; set; }
        [JsonPropertyName("role_typ")]
        public string RoleClaimType { get; set; }
        [JsonPropertyName("claims")]
        public IEnumerable<ClientPrincipalClaim> Claims { get; set; }
    }

    public static ClaimsPrincipal Parse(HttpRequest req)
    {
        var principal = new ClientPrincipal();

        if (req.Headers.TryGetValue("x-ms-client-principal", out var header))
        {
            var data = header[0];
            var decoded = Convert.FromBase64String(data);
            var json = Encoding.UTF8.GetString(decoded);
            principal = JsonSerializer.Deserialize<ClientPrincipal>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
        }

この時点で、コードは principal.Claims を反復処理して、検証の一環として要求を確認できます。 または、 principal.Claims を標準オブジェクトに変換し、それを使用して、後で要求パイプラインでこれらのチェックを行うこともできます。 また、そのオブジェクトを使用して、ユーザー データを関連付け、その他の用途に使用することもできます。

関数の残りの部分では、この変換を実行して、他の .NET コードで使用できる ClaimsPrincipal を作成します。

        var identity = new ClaimsIdentity(principal.IdentityProvider, principal.NameClaimType, principal.RoleClaimType);
        identity.AddClaims(principal.Claims.Select(c => new Claim(c.Type, c.Value)));
        
        return new ClaimsPrincipal(identity);
    }
}

フレームワークごとの代替方法

要求マッピングを機能させるには、アプリの トークン ストア を有効にする必要があります。

API を使用してユーザー要求にアクセスする

トークン ストアがアプリに対して有効になっている場合は、/.auth/meを呼び出して、認証されたユーザーに関するその他の詳細を取得することもできます。