Microsoft 身分識別平台 應用程式驗證憑證認證

Microsoft 身分識別平台 可讓應用程式使用自己的認證進行驗證,例如,在 OAuth 2.0 用戶端認證授與流程和代理者 (OBO) 流程中使用用戶端密碼的任何位置。

應用程式可用於驗證的一種認證形式是 JSON Web 令牌 (JWT) 判斷提示,該判斷提示是以應用程式擁有的憑證簽署。 這會在客戶端驗證選項的 OpenID 連線 規格private_key_jwt中說明。

如果您想要使用另一個識別提供者發出的 JWT 作為應用程式的認證,請參閱 工作負載身分識別同盟 ,以瞭解如何設定同盟原則。

判斷提示格式

若要計算判斷提示,您可以使用您選擇的語言中的其中一個 JWT 連結庫 - MSAL 使用 支援這個 。.WithCertificate() 資訊會由令牌 在其標頭宣告簽章中攜帶。

參數 備註
alg 應該是 RS256
typ 應該是 JWT
x5t X.509 憑證 DER 編碼的Base64url編碼SHA-1指紋。 例如,假設 X.509 憑證哈希 84E05C1D98BCE3A5421D225B140B36E86A3D5534 為 (Hex),宣告 x5t 會是 hOBcHZi846VCHSJbFAs26Go9VTQ (Base64url)。

宣告(承載)

宣告類型 Description
aud https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token “aud” (audience) 宣告會識別 JWT 適用於的收件者(此處為 Microsoft Entra ID)請參閱 RFC 7519 第 4.1.3 節。 在此情況下,該收件者是登入伺服器(login.microsoftonline.com)。
exp 1601519414 “exp” (到期時間) 宣告會識別在 JWT 無法 接受處理之後的到期時間。 請參閱 RFC 7519 第 4.1.4 節。 這可讓判斷提示一直使用,因此請保持短 - 5-10 分鐘後 nbf 最多。 Microsoft Entra ID 目前不會對 exp 時間進行限制。
iss {ClientID} “iss” (issuer) 宣告會識別發出 JWT 的主體,在此案例中為用戶端應用程式。 使用 GUID 應用程式識別碼。
jti (guid) “jti” (JWT ID) 宣告會提供 JWT 的唯一標識符。 標識符值 必須 以確保將相同值意外指派給不同數據物件的機率微不足道;如果應用程式使用多個簽發者,則必須防止在不同簽發者所產生的值之間發生衝突。 “jti” 值是區分大小寫的字串。 RFC 7519 第 4.1.7 節
nbf 1601519114 “nbf” (不是之前) 宣告會識別 JWT 不得接受進行處理的時間。 RFC 7519,第 4.1.5 節。 使用目前的時間是適當的。
sub {ClientID} “sub” (subject) 宣告會識別 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 判斷提示的範例

下列字串是編碼判斷提示的範例。 如果您仔細查看,您會注意到三個區段以點分隔(.):

  • 第一個區段會 編碼標頭
  • 第二個區段會 編碼宣告 (承載)
  • 最後一個區段是使用前兩個區段內容的憑證所計算的簽章
"eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJhdWQiOiJodHRwczpcL1wvbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbVwvam1wcmlldXJob3RtYWlsLm9ubWljcm9zb2Z0LmNvbVwvb2F1dGgyXC90b2tlbiIsImV4cCI6MTQ4NDU5MzM0MSwiaXNzIjoiOTdlMGE1YjctZDc0NS00MGI2LTk0ZmUtNWY3N2QzNWM2ZTA1IiwianRpIjoiMjJiM2JiMjYtZTA0Ni00MmRmLTljOTYtNjVkYmQ3MmMxYzgxIiwibmJmIjoxNDg0NTkyNzQxLCJzdWIiOiI5N2UwYTViNy1kNzQ1LTQwYjYtOTRmZS01Zjc3ZDM1YzZlMDUifQ.
Gh95kHCOEGq5E_ArMBbDXhwKR577scxYaoJ1P{a lot of characters here}KKJDEg"

使用 Microsoft 身分識別平台 註冊您的憑證

您可以使用下列任何方法,透過 Microsoft Entra 系統管理中心,將憑證認證與 Microsoft 身分識別平台 中的用戶端應用程式產生關聯:

上傳憑證檔案

在用戶端應用程式的 [應用程式註冊] 索引標籤中:

  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 身分識別平台。

    屬性 keyCredentials 是多重值,因此您可以上傳多個憑證以進行更豐富的密鑰管理。

使用客戶端判斷提示

用戶端判斷提示可以在使用用戶端秘密的任何位置使用。 例如,在授權碼流程,您可以傳入 client_secret 來證明要求來自您的應用程式。 您可以使用 與 client_assertion_type 參數來取代這個 client_assertion

參數 數值 Description
client_assertion_type urn:ietf:params:oauth:client-assertion-type:jwt-bearer 這是固定值,表示您使用的是憑證認證。
client_assertion JWT 這是上面建立的 JWT。

下一步

MSAL.NET 連結庫會在單行程式代碼中處理此案例

GitHub 上使用 Microsoft 身分識別平台 程式代碼範例的 .NET 精靈控制台應用程式會顯示應用程式如何使用自己的認證進行驗證。 它也會示範如何使用PowerShell Cmdlet建立自我簽署憑證New-SelfSignedCertificate。 您也可以使用 範例存放庫中的應用程式建立腳本 來建立憑證、計算指紋等等。