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 身分識別平台 中的用戶端應用程式產生關聯:
上傳憑證檔案
在用戶端應用程式的 [應用程式註冊] 索引標籤中:
- 選取 [憑證與秘密憑證>]。
- 選取 [ 上傳憑證 ],然後選取要上傳的憑證檔案。
- 選取 [新增]。 上傳憑證之後,會顯示指紋、開始日期和到期值。
更新應用程式指令清單
取得憑證之後,請計算下列值:
$base64Thumbprint
- 憑證哈希的Base64編碼值$base64Value
- 憑證原始數據的Base64編碼值
提供 GUID 以識別應用程式指令清單中的金鑰 ($keyId
)。
在用戶端應用程式的 Azure 應用程式註冊中:
選取 [ 指令清單 ] 以開啟應用程式指令清單。
使用下列架構, 將keyCredentials 屬性取代為您的新憑證資訊。
"keyCredentials": [ { "customKeyIdentifier": "$base64Thumbprint", "keyId": "$keyid", "type": "AsymmetricX509Cert", "usage": "Verify", "value": "$base64Value" } ]
將編輯儲存至應用程式指令清單,然後將指令清單上傳至 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。 |
下一步
GitHub 上使用 Microsoft 身分識別平台 程式代碼範例的 .NET 精靈控制台應用程式會顯示應用程式如何使用自己的認證進行驗證。 它也會示範如何使用PowerShell Cmdlet建立自我簽署憑證New-SelfSignedCertificate
。 您也可以使用 範例存放庫中的應用程式建立腳本 來建立憑證、計算指紋等等。