Microsoft ID プラットフォーム アプリケーションの認証証明書資格情報

Microsoft ID プラットフォームでは、OAuth 2.0 クライアント資格情報付与フローや On-Behalf-Of (OBO) フローなど、クライアント シークレットを使用できるあらゆる場所で、認証用の独自の資格情報をアプリケーションで使用することが許可されています。

アプリケーションが認証を行うために使用できる資格情報の 1 つの形式は、アプリケーションが所有する証明書を使用して署名された JSON Web トークン (JWT) アサーションです。 これについては、private_key_jwtクライアント認証オプションのOpenID Connect仕様」を参照してください。

アプリケーションの資格情報として別の id プロバイダーによって発行された JWT の使用に関心がある場合は、ワークロード IDフェデレーションでフェデレーションポリシーを設定する方法を参照してください。

アサーションの形式

アサーションを計算するには、自分が選択した言語の多数ある JWT ライブラリの中からいずれかを使用できます。MSAL は、.WithCertificate() のこのような使用をサポートしています。 この情報は、トークンによってヘッダー要求、および署名で伝達されます。

パラメーター 注記
alg RS256 です
typ JWT です
x5t X.509 証明書サムプリントの DER エンコーディングの Base64url でエンコードした SHA-1 サムプリント。 たとえば、X.509 証明書ハッシュ 84E05C1D98BCE3A5421D225B140B36E86A3D5534 (Hex) を指定した場合、x5t 要求は hOBcHZi846VCHSJbFAs26Go9VTQ (Base64url) になります。

要求 (ペイロード)

要求の種類 説明
aud https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token "aud" (対象ユーザー) 要求では、JWT が意図する受信者 (ここでは Microsoft Entra ID) を指定します。[RFC 7519、セクション 4.1.3] を参照してください。 この場合、その受信者はログイン サーバー (login.microsoftonline.com) です。
exp 1601519414 "exp" (有効期限) 要求は、それ以降 JWT の処理を受け入れることができなくなる時刻を指定します。 [RFC 7519、セクション 4.1.4] を参照してください。 これにより、そのときまでアサーションを使用できるようになるため、間隔を短く (最大でも nbf の 5 ~ 10 分後に) してください。 Microsoft Entra ID では、現在 exp の時刻に対して制限は設定されていません。
iss {ClientID} "iss" (発行者) 要求では、JWT を発行したプリンシパル (この場合はクライアント アプリケーション) を指定します。 GUID (アプリケーション ID) を使用します。
jti (Guid) "jti" (JWT ID) 要求は、JWT の一意の識別子を提供します。 識別子の値は、同じ値が誤って異なるデータ オブジェクトに割り当てられる可能性が無視できるほど低くなる方法で割り当てる必要があります。複数の発行者を使用するアプリケーションの場合は、異なる発行者が生成した値が競合しないように防ぐ必要もあります。 "jti" 値は大文字と小文字が区別される文字列です。 [RFC 7519、セクション 4.1.7]
nbf 1601519114 "nbf" (指定時刻よりも後) 要求では、指定した時刻よりも後に JWT の処理を受け入れることができるようになります。 [RFC 7519、セクション 4.1.5] 現在の時刻を使用するのが適切です。
sub {ClientID} "sub" (主題) 要求では、JWT の件名 (この場合はお使いのアプリケーション) を指定します。 iss と同じ値を使用します。
iat 1601519114 "iat" (発行時刻) 要求では、JWT が発行された時刻を指定します。 この要求を使用して、JWT の経過時間を特定できます。 [RFC 7519、セクション 4.1.5]

署名

署名は、JSON Web トークン RFC7519 仕様の説明に従って証明書を適用することによって計算されます。

デコードされた JWT アサーションの例

{
  "alg": "RS256",
  "typ": "JWT",
  "x5t": "gx8tGysyjcRqKjFPnd7RFwvwZI0"
}
.
{
  "aud": "https: //login.microsoftonline.com/contoso.onmicrosoft.com/oauth2/v2.0/token",
  "exp": 1484593341,
  "iss": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "jti": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
  "nbf": 1484592741,
  "sub": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
.
"A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u..."

エンコードされた JWT アサーションの例

次の文字列は、エンコードされたアサーションの例です。 よく見ると、ドット (.) で区切られた 3 つのセクションがあることがわかります。

  • 最初のセクションは、"ヘッダー" をエンコードしています。
  • 2 番目のセクションは、"要求" (ペイロード) をエンコードしています。
  • 最後のセクションは、最初の 2 つのセクションのコンテンツからの証明書を使用して計算された "署名" です。
"eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJhdWQiOiJodHRwczpcL1wvbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbVwvam1wcmlldXJob3RtYWlsLm9ubWljcm9zb2Z0LmNvbVwvb2F1dGgyXC90b2tlbiIsImV4cCI6MTQ4NDU5MzM0MSwiaXNzIjoiOTdlMGE1YjctZDc0NS00MGI2LTk0ZmUtNWY3N2QzNWM2ZTA1IiwianRpIjoiMjJiM2JiMjYtZTA0Ni00MmRmLTljOTYtNjVkYmQ3MmMxYzgxIiwibmJmIjoxNDg0NTkyNzQxLCJzdWIiOiI5N2UwYTViNy1kNzQ1LTQwYjYtOTRmZS01Zjc3ZDM1YzZlMDUifQ.
Gh95kHCOEGq5E_ArMBbDXhwKR577scxYaoJ1P{a lot of characters here}KKJDEg"

Microsoft ID プラットフォームに証明書を登録する

次のいずれかの方法を使用して、Microsoft Entra 管理センター経由で Microsoft ID プラットフォームのクライアント アプリケーションに証明書資格情報を関連付けることができます。

証明書ファイルのアップロード

クライアント アプリケーションの [アプリの登録] タブで、次を実行します。

  1. [証明書とシークレット][証明書] の順に選択します。
  2. [証明書のアップロード] を選択し、アップロードする証明書ファイルを選択します。
  3. [追加] を選択します。 証明書がアップロードされると、サムプリント、開始日、有効期限の値が表示されます。

アプリケーション マニフェストの更新

証明書を取得した後、これらの値を計算します。

  • $base64Thumbprint - Base64 でエンコードされた証明書ハッシュの値
  • $base64Value - Base64 でエンコードされた証明書生データの値

GUID を指定して、アプリケーション マニフェストでキーを特定します ($keyId)。

クライアント アプリケーションの Azure アプリ登録で、以下を実行します。

  1. [マニフェスト] を選択して、アプリケーション マニフェストを開きます。

  2. 次のスキーマを使用して、keyCredentials プロパティを新しい証明書情報に置き換えます。

    "keyCredentials": [
        {
            "customKeyIdentifier": "$base64Thumbprint",
            "keyId": "$keyid",
            "type": "AsymmetricX509Cert",
            "usage": "Verify",
            "value":  "$base64Value"
        }
    ]
    
  3. 編集内容をアプリケーション マニフェストに保存した後、そのマニフェストを Microsoft ID プラットフォームにアップロードします。

    keyCredentials プロパティは複数値であるため、複数の証明書をアップロードして、高度なキー管理を行うこともできます。

クライアント アサーションの使用

クライアント アサーションは、クライアント シークレットが使用されるあらゆる場所で使用できます。 たとえば、認証コード フローでは、client_secret を渡して、要求がアプリから送信されていることを証明することができます。 これを client_assertion パラメーターと client_assertion_type パラメーターに置き換えることができます。

パラメーター 価値 説明
client_assertion_type urn:ietf:params:oauth:client-assertion-type:jwt-bearer これは固定値であり、証明書の資格情報を使用していることを示します。
client_assertion JWT これは、上記で作成した JWT です。

次のステップ

1 行のコードで、このシナリオを MSAL.NET ライブラリで処理します。

GitHub の Microsoft ID プラットフォームを使用した .NET デーモン コンソール アプリケーションのコード サンプルは、アプリケーションで独自の資格情報が認証に使用される方法を示しています。 また、New-SelfSignedCertificate PowerShell コマンドレットを使用した自己署名証明書の作成方法も示しています。 さらに、サンプル リポジトリ内のアプリ作成スクリプトを使用して、証明書の作成やサムプリントの計算などを実行することもできます。