Определение технического профиля пользовательской ошибки OAuth2 в настраиваемой политике в Azure Active Directory B2C
Эта статья описывает, как обрабатывать пользовательскую ошибку OAuth2 с помощью Azure Active Directory B2C (Azure AD B2C). Используйте этот технический профиль, если в вашей политике нарушится какая-либо логика. Технический профиль возвращает ошибку в приложение проверяющей стороны OAuth2 или OpenID Connect. Ознакомьтесь с демонстрацией технического профиля настраиваемой ошибки OAuth2.
Чтобы обработать пользовательское сообщение об ошибке OAuth2, сделайте следующее.
- Определите технический профиль ошибки OAuth2.
- Задайте код ошибки и утверждения сообщения об ошибке.
- Из пути взаимодействия пользователя вызовите технический профиль ошибки OAuth2.
Ошибка OAuth2
Ошибка возвращается со следующими данными:
- error -
access_denied
- error_description — сообщение об ошибке, использующее соглашение
AAD_Custom_<errorCode>: <errorMessage>
. - Correlation ID — идентификатор корреляции Azure AD B2C.
- Timestamp — метка времени ошибки.
В следующем примере показано, как пользовательское сообщение об ошибке возвращается в приложение https://jwt.ms.
https://jwt.ms/#error=access_denied&error_description=AAD_Custom_1234%3a+My+custom+error+message%0d%0aCorrelation+ID%3a+233bf9bd-747a-4800-9062-6236f3f69a47%0d%0aTimestamp%3a+2021-03-25+14%3a01%3a23Z%0d%0a
Протокол
Атрибуту Name элемента Protocol необходимо присвоить значение OAuth2
. Для элемента OutputTokenFormat задайте значение OAuth2Error
.
В следующем примере показан технический профиль для ReturnOAuth2Error
:
<!--
<ClaimsProviders> -->
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="ReturnOAuth2Error">
<DisplayName>Return OAuth2 error</DisplayName>
<Protocol Name="OAuth2" />
<OutputTokenFormat>OAuth2Error</OutputTokenFormat>
<CryptographicKeys>
<Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
</CryptographicKeys>
<InputClaims>
<InputClaim ClaimTypeReferenceId="errorCode" />
<InputClaim ClaimTypeReferenceId="errorMessage" />
</InputClaims>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
<!--
</ClaimsProviders> -->
Определение преобразования утверждений для создания пользовательских значений кода ошибки и сообщения об ошибке
Чтобы создать пользовательские значения кода ошибки и сообщения об ошибке, выполните следующие действия.
ClaimsTransformations
Найдите элемент, а затем добавьте в него следующий код.<!-- <ClaimsTransformations> --> <ClaimsTransformation Id="GenerateErrorCode" TransformationMethod="CreateStringClaim"> <InputParameters> <InputParameter Id="value" DataType="string" Value="Error_001" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="errorCode" TransformationClaimType="createdClaim" /> </OutputClaims> </ClaimsTransformation> <ClaimsTransformation Id="GenerateErrorMessage" TransformationMethod="CreateStringClaim"> <InputParameters> <InputParameter Id="value" DataType="string" Value="Insert error description." /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="errorMessage" TransformationClaimType="createdClaim" /> </OutputClaims> </ClaimsTransformation> <!-- </ClaimsTransformations> -->
Добавьте два преобразования утверждений в
OutputClaimsTransformations
элемент любого технического профиля перед определением технического профиля OAuth2:<OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="generateErrorCode" /> <OutputClaimsTransformation ReferenceId="generateErrorMessage" /> </OutputClaimsTransformations>
Входящие утверждения
Элемент InputClaims содержит список утверждений, необходимых для возврата ошибки OAuth2.
ClaimReferenceId | Обязательное поле | Description |
---|---|---|
errorCode | Да | Код ошибки. |
errorMessage | Да | Сообщение об ошибке. |
Криптографические ключи
Элемент CryptographicKeys содержит следующий ключ:
Атрибут | Обязательное поле | Описание |
---|---|---|
issuer_secret | Да | Сертификат X509 (ключ RSA задан). Используйте ключ B2C_1A_TokenSigningKeyContainer , настроенный в разделе Начало работы с настраиваемыми политиками. |
Вызов технического профиля
Вы можете вызвать технический профиль ошибки OAuth2 из пути взаимодействия пользователя или из промежуточного пути (тип transfer
). Задайте для типа шага оркестрации значение SendClaims
со ссылкой на технический профиль ошибки OAuth2.
Если в пути взаимодействия пользователя или промежуточном пути уже есть другой шаг оркестрации SendClaims
, присвойте атрибут DefaultCpimIssuerTechnicalProfileReferenceId
техническому профилю издателя токенов.
В следующем примере :
- Путь взаимодействия пользователя
SignUpOrSignIn-Custom
задает дляDefaultCpimIssuerTechnicalProfileReferenceId
технический профиль издателя токеновJwtIssuer
. - Восьмой шаг оркестрации проверяет, существует ли
errorCode
. Если это так, вызовите технический профильReturnOAuth2Error
, чтобы возвратить ошибку. - Если
errorCode
не существует, то девятый шаг оркестрации выдает токен.
<UserJourney Id="SignUpOrSignIn-Custom" DefaultCpimIssuerTechnicalProfileReferenceId="JwtIssuer">
<OrchestrationSteps>
...
<OrchestrationStep Order="8" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="ReturnOAuth2Error">
<Preconditions>
<Precondition Type="ClaimsExist" ExecuteActionsIf="false">
<Value>errorCode</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
</OrchestrationStep>
<OrchestrationStep Order="9" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
<ClientDefinition ReferenceId="DefaultWeb" />
</UserJourney>
При необходимости можно использовать предварительные условия для управления техническим профилем ошибки OAuth2. Например, если нет утверждения электронной почты, можно задать для вызова технического профиля ошибки OAuth2:
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="ReturnOAuth2Error">
<Preconditions>
<Precondition Type="ClaimsExist" ExecuteActionsIf="false">
<Value>email</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
</OrchestrationStep>
Следующие шаги
Дополнительные сведения о UserJourneys