要求 Azure Active Directory B2C 中的存取權杖
存取權杖中包含宣告,可讓您在 Azure Active Directory B2C (Azure AD B2C) 中用來識別為 API 授與的權限。 若要呼叫資源伺服器,HTTP 要求必須包含存取權杖。 存取權杖在 Azure AD B2C 的回應中會以 access_token 表示。
本文說明如何要求 Web 應用程式和 Web API 的存取權杖。 若要進一步了解 Azure AD B2C 中的權杖,請參閱 Azure Active Directory B2C 中的權杖概觀。
注意
Azure AD B2C 不支援 (代理者) Web API 鏈結 - 許多架構都包含需要呼叫另一個下游 Web API 的 Web API,這兩者都受到 Azure AD B2C 保護。 用戶端若具有 Web API 後端 (會接著呼叫另一個服務),就常會有這種情況。 使用 OAuth 2.0 JWT 持有人認證授與可支援此鏈結的 Web API 案例,亦稱為「代理者流程」。 不過,Azure AD B2C 目前未實作代理者流程。 雖然代理者適用于在Microsoft Entra識別碼中註冊的應用程式,但不適用於在 Azure AD B2C 中註冊的應用程式,不論租使用者 (Microsoft Entra 識別碼或發出權杖的 Azure AD B2C) 為何。
必要條件
- 建立使用者流程,讓使用者註冊並登入您的應用程式。
- 將 Web API 應用程式新增至您的 Azure Active Directory B2C 租用戶 (如果您尚未這麼做)。
範圍
範圍可讓您管理受保護資源的權限。 在要求存取權杖時,用戶端應用程式必須在要求的範圍參數中指定所需的權限。 例如,若要將 [App ID URI] 為 https://contoso.onmicrosoft.com/api
之 API 的 [範圍值] 指定為 read
,則範圍為 https://contoso.onmicrosoft.com/api/read
。
Web API 可使用範圍來實作以範圍為基礎的存取控制。 例如,Web API 的使用者可以同時具有讀取和寫入權限,Web API 的使用者也可能只具有讀取權限。 若要在相同的要求中取得多個權限,您可以要求的在單一範圍參數中新增以空格分隔的多個項目。
下列範例顯示在 URL 中解碼的範圍:
scope=https://contoso.onmicrosoft.com/api/read openid offline_access
下列範例顯示在 URL 中編碼的範圍:
scope=https%3A%2F%2Fcontoso.onmicrosoft.com%2Fapi%2Fread%20openid%20offline_access
如果您要求的範圍比針對用戶端應用程式授與的數目多,但至少已授與一個權限,則呼叫會成功。 在產生的存取權杖中,scp 宣告只會填入成功授與的權限。
OpenId Connect 範圍
OpenID Connect 標準會指定數個特殊的範圍值。 下列範圍代表存取使用者設定檔的權限︰
- openid - 要求識別碼權杖。
- offline_access - 使用授權碼流程要求重新整理權杖。
- 00000000-0000-0000-0000-000000000000 - 使用用戶端識別碼作為範圍時,表示您的應用程式需要可針對您自己的服務或 Web API 使用的存取權杖 (以相同的用戶端識別碼表示)。
如果 /authorize
要求中的 response_type 參數包含 token
,則範圍參數必須包含至少一個會授與的資源範圍 (openid
與 offline_access
除外)。 否則,/authorize
要求將會失敗。
要求權杖
若要要求存取權杖,您必須要有授權碼。 以下是授權碼端點 /authorize
的要求範例:
GET https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/authorize?
client_id=<application-ID>
&nonce=anyRandomValue
&redirect_uri=https://jwt.ms
&scope=<application-ID-URI>/<scope-name>
&response_type=code
取代查詢字串中的值,如下所示:
-
<tenant-name>
- Azure AD B2C 租用戶的名稱。 如果您是使用自訂網域,請將tenant-name.b2clogin.com
取代為您的網域,例如contoso.com
。 -
<policy-name>
- 您的自訂原則或使用者流程名稱。 -
<application-ID>
- 您註冊以支援使用者流程之 Web 應用程式的應用程式識別碼。 -
<application-ID-URI>
- 您在用戶端應用程式的 [公開 API] 刀鋒視窗底下設定的應用程式識別碼 URI。 -
<scope-name>
- 您在用戶端應用程式的 [公開 API] 刀鋒視窗底下新增的範圍名稱。 -
<redirect-uri>
- 您註冊用戶端應用程式時所輸入的 [重新導向 URI]。
若要了解要求的運作方式,請將要求貼到瀏覽器中並加以執行。
這是流程的互動式部分,您可以在其中採取動作。 系統會要求您完成使用者流程的工作流程。 您可能必須在登入表單或若干步驟中輸入您的使用者名稱和密碼。 您須完成的步驟取決於使用者流程的定義方式。
具有授權碼的回應會類似於下列範例:
https://jwt.ms/?code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...
成功接收授權碼後,您可以將其用來要求存取權杖。 參數位於 HTTP POST 要求的主體中:
POST <tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/token HTTP/1.1
Host: <tenant-name>.b2clogin.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&client_id=<application-ID>
&scope=<application-ID-URI>/<scope-name>
&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...
&redirect_uri=https://jwt.ms
&client_secret=2hMG2-_:y12n10vwH...
如果您想要測試此 POST HTTP 要求,您可以使用任何 HTTP 用戶端,例如 Microsoft PowerShell 或 Postman。
成功的權杖回應如下所示:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrN...",
"token_type": "Bearer",
"not_before": 1549647431,
"expires_in": 3600,
"expires_on": 1549651031,
"resource": "f2a76e08-93f2-4350-833c-965c02483b11",
"profile_info": "eyJ2ZXIiOiIxLjAiLCJ0aWQiOiJjNjRhNGY3ZC0zMDkxLTRjNzMtYTcyMi1hM2YwNjk0Z..."
}
使用 https://jwt.ms 檢查傳回的存取權杖時,您應該會看到類似下列範例的內容:
{
"typ": "JWT",
"alg": "RS256",
"kid": "X5eXk4xyojNFum1kl2Ytv8dl..."
}.{
"iss": "https://contoso0926tenant.b2clogin.com/c64a4f7d-3091-4c73-a7.../v2.0/",
"exp": 1549651031,
"nbf": 1549647431,
"aud": "f2a76e08-93f2-4350-833c-965...",
"oid": "1558f87f-452b-4757-bcd1-883...",
"sub": "1558f87f-452b-4757-bcd1-883...",
"name": "David",
"tfp": "B2C_1_signupsignin1",
"nonce": "anyRandomValue",
"scp": "read",
"azp": "38307aee-303c-4fff-8087-d8d2...",
"ver": "1.0",
"iat": 1549647431
}.[Signature]