Define an OAuth2 technical profile in an Azure Active Directory B2C custom policy
Note
In Azure Active Directory B2C, custom policies are designed primarily to address complex scenarios. For most scenarios, we recommend that you use built-in user flows. If you've not done so, learn about custom policy starter pack in Get started with custom policies in Active Directory B2C.
Azure Active Directory B2C (Azure AD B2C) provides support for the OAuth2 protocol identity provider. OAuth2 is the primary protocol for authorization and delegated authentication. For more information, see the RFC 6749 The OAuth 2.0 Authorization Framework. With an OAuth2 technical profile, you can federate with an OAuth2 based identity provider, such as Facebook. Federating with an identity provider allows users to sign in with their existing social or enterprise identities.
Protocol
The Name attribute of the Protocol element needs to be set to OAuth2
. For example, the protocol for the Facebook-OAUTH technical profile is OAuth2
:
<TechnicalProfile Id="Facebook-OAUTH">
<DisplayName>Facebook</DisplayName>
<Protocol Name="OAuth2" />
...
Input claims
The InputClaims and InputClaimsTransformations elements are not required. But you may want to send more parameters to your identity provider. The following example adds the domain_hint query string parameter with the value of contoso.com
to the authorization request.
<InputClaims>
<InputClaim ClaimTypeReferenceId="domain_hint" DefaultValue="contoso.com" />
</InputClaims>
Output claims
The OutputClaims element contains a list of claims returned by the OAuth2 identity provider. You may need to map the name of the claim defined in your policy to the name defined in the identity provider. You can also include claims that aren't returned by the identity provider as long as you set the DefaultValue
attribute.
The OutputClaimsTransformations element may contain a collection of OutputClaimsTransformation elements that are used to modify the output claims or generate new ones.
The following example shows the claims returned by the Facebook identity provider:
- The first_name claim is mapped to the givenName claim.
- The last_name claim is mapped to the surname claim.
- The displayName claim without name-mapping.
- The email claim without name mapping.
The technical profile also returns claims that aren't returned by the identity provider:
- The identityProvider claim that contains the name of the identity provider.
- The authenticationSource claim with a default value of socialIdpAuthentication.
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="id" />
<OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="first_name" />
<OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="last_name" />
<OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
<OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="facebook.com" />
<OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
</OutputClaims>
Authorization endpoint metadata
The authorization flow begins when Azure AD B2C directs the user to the OAuth2 identity providers /authorize
endpoint. The call to the authorization endpoint is the interactive part of the flow, where the user takes action. At this point, the user is asked to complete the sign-in at the OAuth2 identity provider. For example, by entering their username and password.
Azure AD B2C creates an authorization request by providing the client ID, scopes, redirect URI and other parameters that it needs to acquire an access token from the identity provider. This section describes the authorization endpoint metadata, which allows configuring the request to the /authorize
endpoint of the identity provider.
The request to the authorization endpoint is always HTTP GET. The following sample demonstrates a call to the authorization endpoint.
GET https://login.contoso.com/oauth/v2/authorization?
client_id=12345
&response_type=code
&response_mode=query
&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob
&scope=profile%20offline_access
&redirect_uri=https%3a%2f%2fabrikam.b2clogin.com%2fabrikam.onmicrosoft.com%2foauth2%2fauthresp
&state=...
The following table lists the authorization endpoint metadata.
Attribute | Required | Description |
---|---|---|
authorization_endpoint |
Yes | The URL of the authorization endpoint as per RFC 6749. |
client_id |
Yes | The application identifier of the identity provider. |
AdditionalRequestQueryParameters |
No | Extra request query parameters. For example, you may want to send extra parameters to your identity provider. You can include multiple parameters using comma delimiter. |
response_mode |
No | The method that the identity provider uses to send the result back to Azure AD B2C. Possible values: query , form_post (default), or fragment . |
scope |
No | The scope of the request that is defined according to the OAuth2 identity provider specification. Such as openid , profile , and email . |
UsePolicyInRedirectUri |
No | Indicates whether to use a policy when constructing the redirect URI. When you configure your application in the identity provider, you need to specify the redirect URI. The redirect URI points to Azure AD B2C, https://{your-tenant-name}.b2clogin.com/{your-tenant-name}.onmicrosoft.com/oauth2/authresp . If you specify true , you need to add a redirect URI for each policy you use. For example: https://{your-tenant-name}.b2clogin.com/{your-tenant-name}.onmicrosoft.com/{policy-name}/oauth2/authresp . |
Token endpoint metadata
After the user completes their authentication at the authorization endpoint of the identity provider, a response containing the authorization code
is returned to Azure AD B2C. Azure AD B2C redeems the authorization code for an access token by sending a POST request to the /token
endpoint of the identity provider. This section describes the token endpoint metadata, which allows configuring the request to the /token
endpoint of the identity provider.
The following HTTP request shows an Azure AD B2C call to the identity provider's token endpoint.
POST https://contoso/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&client_id=12345&scope=profile offline_access&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
The following table lists the token endpoint metadata.
Attribute | Required | Description |
---|---|---|
AccessTokenEndpoint |
Yes | The URL of the token endpoint. For example, https://www.linkedin.com/oauth/v2/accessToken . |
HttpBinding |
No | The expected HTTP binding to the token endpoint. Possible values: GET or POST . |
AccessTokenResponseFormat |
No | The format of the access token endpoint call. For example, Facebook requires an HTTP GET method, but the access token response is in JSON format. Possible values: Default , Json , and JsonP . |
ExtraParamsInAccessTokenEndpointResponse |
No | Contains the extra parameters that can be returned in the response from AccessTokenEndpoint by some identity providers. For example, the response from AccessTokenEndpoint contains an extra parameter such as openid , which is a mandatory parameter besides the access_token in a ClaimsEndpoint request query string. Multiple parameter names should be escaped and separated by the comma ',' delimiter. |
token_endpoint_auth_method |
No | Specifies how Azure AD B2C sends the authentication header to the token endpoint. Possible values: client_secret_post (default), and client_secret_basic , private_key_jwt . For more information, see OpenID Connect client authentication section. |
token_signing_algorithm |
No | Specifies the signing algorithm to use when token_endpoint_auth_method is set to private_key_jwt . Possible values: RS256 (default) or RS512 . |
Configure HTTP binding method
By default the request to the token endpoint uses HTTP POST.
<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">POST</Item>
The following HTTP call demonstrates a call to the token endpoint using HTTP POST request:
POST /oauth2/token
client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code
For identity providers that require the use of HTTP GET method at the /token
endpoint, set the HttpBinding
metadata to GET
. Note, in the following example, the AccessTokenResponseFormat
is set to json
, since the token endpoint returns the response in JSON format.
<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">GET</Item>
<Item Key="AccessTokenResponseFormat">json</Item>
GET /oauth2/token?client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code
Configure the access token response format
For identity providers that support HTTP POST method, the AccessTokenResponseFormat
is set by default to json
. If the identity provider supports HTTP GET request, you have to set the access token response format to json
explicitly.
<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">GET</Item>
<Item Key="AccessTokenResponseFormat">json</Item>
The following example demonstrates a token endpoint response in JSON format:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...",
"token_type": "Bearer",
"not_before": 1637924390,
"expires_in": 960000,
}
Configure the authentication method
Requests to the token endpoint always require authentication. By default Azure AD B2C provides the identity provider with client credentials. By default the authentication method is client_secret_post
, including the client credentials (client_id
and client_secret
) in the request body.
The following HTTP request to the token endpoint contains the client_id
and the client_secret
in the POST data. For GET requests client_id
and the client_secret
are included in the query string parameters.
POST /oauth2/token
client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code
For identity providers that require the use of HTTP basic authentication at their /token
endpoint, configure the token_endpoint_auth_method
metadata to client_secret_basic
. With this type of authentication method, the client credentials are passed to the identity provider using the HTTP Basic authentication scheme.
<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="token_endpoint_auth_method">client_secret_basic</Item>
The following HTTP request demonstrates a call to the token endpoint with HTTP basic authentication. The authorization header contains the client ID and client secret, in the format client_ID:client_secret
, base64 encoded.
POST /oauth2/token
Authorization: Basic YWJjZDoxMjM0
redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code
For identity providers that support private key JWT authentication, configure the token_endpoint_auth_method
metadata to private_key_jwt
. With this type of authentication method, the certificate provided to Azure AD B2C is used to generate a signed assertion, which is passed to the identity provider through the client_assertion
parameter. The client_assertion_type
set to urn:ietf:params:oauth:client-assertion-type:jwt-bearer
. The token_signing_algorithm
metadata specifies the signing algorithm of the JWT token.
<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="token_endpoint_auth_method">private_key_jwt</Item>
<Item Key="token_signing_algorithm">RS256</Item>
The following HTTP request demonstrates a call to the token endpoint using private key JWT authentication.
POST /oauth2/token
client_assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjJFRFg0dWRYeDIxbXNoaXdJVzczMUY3OUZSbFJiUDZXVXJyZmktR1RFeVkifQ.eyJpc3MiOiJhYmNkIiwiZXhwIjoxNjM3OTI5ODY0LCJuYmYiOjE2Mzc5Mjk1NjQsImF1ZCI6Imh0dHBzOi8vNWRlNC0xMDktNjQtMTI0LTUzLm5ncm9rLmlvL2FjY2Vzc190b2tlbiIsImp0aSI6IjVxQWlGV2lEODNDbU1KWWNrejBRdGc9PSIsInN1YiI6ImFiY2QiLCJpYXQiOjE2Mzc5Mjk1NjR9.C4OtRnrLaQatpT5LP45O5Nb418S4v8yZi_C42ld440w&client_id=abcd&client_assertion_type=urn%3aietf%3aparams%3aoauth%3aclient-assertion-type%3ajwt-bearer&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code
User info endpoint metadata
After Azure AD B2C gets the access token from the OAuth2 identity provider, it makes a call to the user info endpoint. The user info endpoint, also known as claims endpoint is designed to retrieve claims about the authenticated user. Azure AD B2C uses bearer token authentication to authenticate to the identity providers user info endpoint. The bearer token is the access token that Azure AD B2C obtains from the identity providers /token
endpoint.
The request to the user info endpoint is always HTTP GET. The access token is sent in a query string parameter named access_token
. The following HTTP request shows a call to the user info endpoint with the access token in the query string parameter.
GET /oauth2/claims?access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...
The following table lists the user info endpoint metadata.
Attribute | Required | Description |
---|---|---|
ClaimsEndpoint |
Yes | The URL of the user information endpoint. For example, https://api.linkedin.com/v2/me . |
ClaimsEndpointAccessTokenName |
No | The name of the access token query string parameter. Default value: access_token . |
ClaimsEndpointFormatName |
No | The name of the format query string parameter. For example, you can set the name as format in this LinkedIn claims endpoint https://api.linkedin.com/v1/people/~?format=json . |
ClaimsEndpointFormat |
No | The value of the format query string parameter. For example, you can set the value as json in this LinkedIn claims endpoint https://api.linkedin.com/v1/people/~?format=json . |
BearerTokenTransmissionMethod |
No | Specifies how the token is sent. The default method is a query string. To send the token as a request header, set to AuthorizationHeader . |
ExtraParamsInClaimsEndpointRequest |
No | Contains the extra parameters that can be returned in the ClaimsEndpoint request by some identity providers. Multiple parameter names should be escaped and separated by the comma ',' delimiter. |
Configure the access token query string parameter
The user info endpoint may require the access token to be sent in a particular query string parameter. To change the name of the query string parameter, which contains the access token, use the ClaimsEndpointAccessTokenName
metadata. In the following example, the access token query string parameter is set to token
.
<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="ClaimsEndpointAccessTokenName">token</Item>
The following HTTP call demonstrates a call to the user info endpoint with ClaimsEndpointAccessTokenName
set to token
:
GET /oauth2/claims?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...
Configure the claims format
The ClaimsEndpointFormatName
and ClaimsEndpointFormat
allow you to send a key-value pair query string parameter to the user info endpoint. The following example configures a query string parameter named format
, with the value of json
.
<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="ClaimsEndpointFormatName">format</Item>
<Item Key="ClaimsEndpointFormat">json</Item>
The following HTTP request demonstrates a call to the user info endpoint with ClaimsEndpointFormatName
and ClaimsEndpointFormat
configured.
GET /oauth2/claims?format=json&access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...
Configure bearer token transmission method
By default the access token is sent to the identity providers user info endpoint through a query string parameter. To send the token within the HTTP Authorization
header, set BearerTokenTransmissionMethod
metadata to AuthorizationHeader
.
<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="BearerTokenTransmissionMethod">AuthorizationHeader</Item>
The following HTTP request demonstrates how the access token is passed when BearerTokenTransmissionMethod
is set to AuthorizationHeader
.
GET /oauth2/claims
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...
Pass parameters returned by the token endpoint
Some identity providers require to pass extra parameters that are returned from the token endpoint to the user info endpoint. For example, the response from token endpoint contains a parameter named resource
, which is a mandatory parameter of the user info endpoint (besides the access token). Use the ExtraParamsInClaimsEndpointRequest
metadata to specify any extra parameters to pass. Multiple parameter names should be escaped and separated by the comma ',' delimiter.
The following JSON demonstrates a JSON payload return by the token endpoint with a parameter named resource
.
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...",
"token_type": "Bearer",
"not_before": 1549647431,
"expires_in": 960000,
"resource": "f2a76e08-93f2-4350-833c-965c02483b11"
}
To pass the resource
parameter to the user info endpoint, add the following metadata:
<Item Key="ExtraParamsInClaimsEndpointRequest">resource</Item>
The following HTTP request demonstrates how the resource
parameter is passed to the user info endpoint.
GET /oauth2/claims?resource=f2a76e08-93f2-4350-833c-965c02483b11&access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...
End session endpoint
To sign the user out of the application, redirect the user to the Azure AD B2C sign-out endpoint (for both OAuth2 and OpenID Connect) or send a LogoutRequest
(for SAML). Azure AD B2C will clear the user's session from the browser. Upon a sign-out request, Azure AD B2C attempts to sign out from any federated identity providers the user may have signed in through. The OAuth2 identity provider's sign-out URI is configured in the end_session_endpoint
metadata. When the user logs out of your application via Azure AD B2C, a hidden iframe will be created which will call the end_session_endpoint
at their Azure AD B2C sign-out page.
The following table lists the user info endpoint metadata.
Attribute | Required | Description |
---|---|---|
end_session_endpoint |
Yes | The URL of the end session endpoint as per RFC 6749. |
SingleLogoutEnabled |
No | Indicates whether during sign-in the technical profile attempts to sign out from federated identity providers. For more information, see Azure AD B2C session sign-out. Possible values: true (default), or false . |
OAuth2 generic metadata
The following table lists the OAuth2 identity provider generic metadata. The metadata describes how the OAuth2 technical profile handles token validation, get the claims, and react to error messages.
Attribute | Required | Description |
---|---|---|
IdTokenAudience |
No | The audience of the id_token. If specified, Azure AD B2C checks whether the token is in a claim returned by the identity provider and is equal to the one specified. |
ProviderName |
No | The name of the identity provider. |
ResponseErrorCodeParamName |
No | The name of the parameter that contains the error message returned over HTTP 200 (Ok). |
IncludeClaimResolvingInClaimsHandling |
No | For input and output claims, specifies whether claims resolution is included in the technical profile. Possible values: true , or false (default). If you want to use a claims resolver in the technical profile, set this to true . |
ResolveJsonPathsInJsonTokens |
No | Indicates whether the technical profile resolves JSON paths. Possible values: true , or false (default). Use this metadata to read data from a nested JSON element. In an OutputClaim, set the PartnerClaimType to the JSON path element you want to output. For example: firstName.localized , or data[0].to[0].email . |
Cryptographic keys
The CryptographicKeys element contains the following attribute:
Attribute | Required | Description |
---|---|---|
client_secret |
Yes | The client secret of the identity provider application. The cryptographic key is required only if the response_types metadata is set to code . In this case, Azure AD B2C makes another call to exchange the authorization code for an access token. If the metadata is set to id_token , you can omit the cryptographic key. |
assertion_signing_key |
No | When the token_endpoint_auth_method metadata is set to private_key_jwt , provide a X509 certificate to use to sign the JWT key. This key should be provided to you by the OAuth2 identity provider. |
Redirect URI
When you configure the redirect URI of your identity provider, enter https://{tenant-name}.b2clogin.com/{tenant-name}.onmicrosoft.com/oauth2/authresp
. Make sure to replace {tenant-name}
with your tenant's name (for example, contosob2c). The redirect URI needs to be in all lowercase.