Определение технического профиля RESTful в пользовательской политике Azure Active Directory B2C

Это важно

Начиная с 1 мая 2025 г. Azure AD B2C больше не будет доступен для приобретения для новых клиентов. Дополнительные сведения см. в разделе "Вопросы и ответы".

Замечание

В Azure Active Directory B2C пользовательские политики преимущественно предназначены для выполнения сложных сценариев. В большинстве случаев рекомендуется использовать встроенные потоки пользователей. Ознакомьтесь со статьей Начало работы с настраиваемыми политиками в Azure Active Directory B2C, чтобы узнать о базовом пакете настраиваемых политик, если еще не сделали этого.

Azure Active Directory B2C (Azure AD B2C) обеспечивает поддержку интеграции собственной службы RESTful. Azure AD B2C отправляет данные в службу RESTful в коллекции входных утверждений и получает данные обратно в коллекции выходных утверждений. Дополнительные сведения см. в статье Интеграция обмена утверждениями REST API в настраиваемой политике Azure AD B2C.

Протокол

Атрибуту Name элемента Protocol необходимо присвоить значение Proprietary. Атрибут обработчика должен содержать полное имя сборки обработчика протокола, которая используется Azure AD B2C: Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.

В следующем примере показан технический профиль RESTful:

<TechnicalProfile Id="REST-UserMembershipValidator">
  <DisplayName>Validate user input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  ...

Входящие утверждения

Элемент InputClaims содержит список утверждений для отправки в REST API. Вы также можете сопоставить имя утверждения с именем, определенным в REST API. В следующем примере показано сопоставление между политикой и REST API. Утверждение givenName отправляется в REST API как firstName, а фамилия отправляется как lastName. Утверждение электронной почты задано как есть.

<InputClaims>
  <InputClaim ClaimTypeReferenceId="email" />
  <InputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="firstName" />
  <InputClaim ClaimTypeReferenceId="surname" PartnerClaimType="lastName" />
</InputClaims>

Элемент InputClaimsTransformations может содержать коллекцию элементов InputClaimsTransformation , которые используются для изменения входных утверждений или создания новых перед отправкой в REST API.

Отправка полезных данных JSON

Технический профиль REST API позволяет отправлять сложные полезные данные JSON в конечную точку.

Чтобы отправить сложную полезные данные JSON, выполните приведенные далее действия.

  1. Создайте полезные данные JSON с помощью преобразования утверждений GenerateJson .
  2. В техническом профиле REST API:
    1. Добавьте преобразование входных утверждений со ссылкой на преобразование утверждений GenerateJson .
    2. Задайте для параметра метаданных SendClaimsIn значение body
    3. ClaimUsedForRequestPayload Задайте для параметра метаданных имя утверждения, содержащего полезные данные JSON.
    4. В входном утверждении добавьте ссылку на входное утверждение, содержащее полезные данные JSON.

В следующем примере TechnicalProfile отправляется сообщение электронной почты проверки с помощью сторонней службы электронной почты (в данном случае SendGrid).

<TechnicalProfile Id="SendGrid">
  <DisplayName>Use SendGrid's email API to send the code to the user</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://api.sendgrid.com/v3/mail/send</Item>
    <Item Key="AuthenticationType">Bearer</Item>
    <Item Key="SendClaimsIn">Body</Item>
    <Item Key="ClaimUsedForRequestPayload">sendGridReqBody</Item>
    <Item Key="DefaultUserMessageIfRequestFailed">Cannot process your request right now, please try again later.</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="BearerAuthenticationToken" StorageReferenceId="B2C_1A_SendGridApiKey" />
  </CryptographicKeys>
  <InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="GenerateSendGridRequestBody" />
  </InputClaimsTransformations>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="sendGridReqBody" />
  </InputClaims>
</TechnicalProfile>

Исходящие утверждения

Элемент OutputClaims содержит список утверждений, возвращаемых REST API. Возможно, потребуется сопоставить имя утверждения, определенного в политике, с именем, определенным в REST API. Кроме того, можно включить утверждения, которые не возвращаются REST API, если вы задали DefaultValue атрибут.

Элемент OutputClaimsTransformations может содержать коллекцию элементов OutputClaimsTransformation , которые используются для изменения выходных утверждений или создания новых.

В следующем примере показано утверждение, возвращаемое REST API:

  • Утверждение MembershipId, сопоставленного с именем утверждения лояльностиNumber.

Технический профиль также возвращает утверждения, которые не возвращаются поставщиком удостоверений:

  • Утверждение loyaltyNumberIsNew с заданным значением trueпо умолчанию.
<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="loyaltyNumber" PartnerClaimType="MembershipId" />
  <OutputClaim ClaimTypeReferenceId="loyaltyNumberIsNew" DefaultValue="true" />
</OutputClaims>

Метаданные

Свойство Обязательно Описание
ServiceUrl Да URL-адрес конечной точки REST API.
Тип аутентификации Да Тип проверки подлинности, выполняемой поставщиком утверждений RESTful. Возможные значения: None, , BasicBearer, ClientCertificateили ApiKeyHeader.
  • Значение None указывает, что REST API является анонимным.
  • Значение Basic указывает, что REST API защищен с помощью базовой проверки подлинности HTTP. Только проверенные пользователи, включая Azure AD B2C, могут получить доступ к API.
  • Значение ClientCertificate (рекомендуется) указывает, что REST API ограничивает доступ с помощью проверки подлинности сертификата клиента. Доступ к API может получить только службы, имеющие соответствующие сертификаты, например Azure AD B2C.
  • Значение Bearer указывает, что REST API ограничивает доступ с помощью маркера носителя OAuth2 клиента.
  • Значение ApiKeyHeader указывает, что REST API защищен с помощью заголовка HTTP ключа API, например x-functions-key.
AllowInsecureAuthInProduction нет Указывает, может ли AuthenticationType быть задано none значение в рабочей среде (DeploymentMode для параметра TrustFrameworkPolicy задано Productionзначение или не указано). Возможные значения: true или false (по умолчанию).
SendClaimsIn (ОтправитьClaimsIn) нет Указывает, как входные утверждения отправляются поставщику утверждений RESTful. Возможные значения: Body (по умолчанию), FormHeader, Url или QueryString.
Это Body значение — входное утверждение, которое отправляется в тексте запроса в формате JSON.
Значение Form — это входное утверждение, которое отправляется в тексте запроса в формате значения ключа с разделителями "&ersand".
Значением Header является входное утверждение, которое отправляется в заголовке запроса.
Значение Url — это входное утверждение, которое отправляется в URL-адресе, например https://api.example.com/{claim1}/{claim2}?{claim3}={claim4}. Имя узла, часть URL-адреса не может содержать утверждения.
Значением QueryString является входное утверждение, которое отправляется в строке запроса.
Команды HTTP, вызываемые каждым из них, приведены следующим образом:
  • Body:ПОМЕСТИТЬ
  • Form:ПОМЕСТИТЬ
  • Header:ПОЛУЧИТЬ
  • Url:ПОЛУЧИТЬ
  • QueryString:ПОЛУЧИТЬ
ClaimsFormat нет В настоящее время не используется, можно игнорировать.
ClaimUsedForRequestPayload (ClaimUsedForRequestPayload) нет Имя строкового утверждения, содержащего полезные данные для отправки в REST API.
Режим отладки нет Запускает технический профиль в режиме отладки. Возможные значения: true или false (по умолчанию). В режиме отладки REST API может возвращать дополнительные сведения. См. раздел "Возвращаемое сообщение об ошибке ".
IncludeClaimResolvingInClaimsHandling нет Для входных и выходных утверждений указывает, входит ли разрешение утверждений в технический профиль. Возможные значения: true или false (по умолчанию). Если вы хотите использовать сопоставитель утверждений в техническом профиле, задайте для этого значение true.
РешениеJsonPathsInJsonTokens нет Указывает, разрешает ли технический профиль пути JSON. Возможные значения: true или false (по умолчанию). Используйте эти метаданные для чтения данных из вложенного элемента JSON. В outputClaim задайте PartnerClaimType для элемента пути JSON, который требуется вывести. Например, firstName.localized или data[0].to[0].email.
UseClaimAsBearerToken (UseClaimAsBearerToken) нет Имя утверждения, содержащего маркер носителя.

Обработка ошибок

Следующие метаданные можно использовать для настройки сообщений об ошибках, отображаемых при сбое REST API. Сообщения об ошибках можно локализовать.

Свойство Обязательно Описание
DefaultUserMessageIfRequestFailed нет По умолчанию настраивается сообщение об ошибке для всех исключений REST API.
UserMessageIfCircuitOpen (Пользовательское сообщениеIfCircuit) нет Сообщение об ошибке, когда REST API недоступен. Если не указано, возвращается значение DefaultUserMessageIfRequestFailed.
UserMessageIfDnsResolutionFailed нет Сообщение об ошибке исключения разрешения DNS. Если не указано, возвращается значение DefaultUserMessageIfRequestFailed.
UserMessageIfRequestTimeout нет Сообщение об ошибке при истечении времени ожидания подключения. Если не указано, возвращается значение DefaultUserMessageIfRequestFailed.

Криптографические ключи

Если задан Noneтип проверки подлинности, элемент CryptographicKeys не используется.

<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">None</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
</TechnicalProfile>

Если задан Basicтип проверки подлинности, элемент CryptographicKeys содержит следующие атрибуты:

Свойство Обязательно Описание
БазоваяАутентификацияИмя пользователя Да Имя пользователя, используемое для проверки подлинности.
БазовыйАутентификацияПароль Да Пароль, используемый для проверки подлинности.

В следующем примере показан технический профиль с базовой проверкой подлинности:

<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">Basic</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="BasicAuthenticationUsername" StorageReferenceId="B2C_1A_B2cRestClientId" />
    <Key Id="BasicAuthenticationPassword" StorageReferenceId="B2C_1A_B2cRestClientSecret" />
  </CryptographicKeys>
</TechnicalProfile>

Если задан ClientCertificateтип проверки подлинности, элемент CryptographicKeys содержит следующий атрибут:

Свойство Обязательно Описание
Клиентский сертификат Да Сертификат X509 (набор ключей RSA), используемый для проверки подлинности.
<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">ClientCertificate</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="ClientCertificate" StorageReferenceId="B2C_1A_B2cRestClientCertificate" />
  </CryptographicKeys>
</TechnicalProfile>

Если задан Bearerтип проверки подлинности, элемент CryptographicKeys содержит следующий атрибут:

Свойство Обязательно Описание
Маркер аутентификации носителя нет Маркер носителя OAuth 2.0.
<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">Bearer</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="BearerAuthenticationToken" StorageReferenceId="B2C_1A_B2cRestClientAccessToken" />
  </CryptographicKeys>
</TechnicalProfile>

Если задан ApiKeyHeaderтип проверки подлинности, элемент CryptographicKeys содержит следующий атрибут:

Свойство Обязательно Описание
Имя заголовка HTTP, например x-functions-keyили x-api-key. Да Ключ, используемый для проверки подлинности.

Замечание

В настоящее время Azure AD B2C поддерживает только один заголовок HTTP для проверки подлинности. Если для вызова RESTful требуется несколько заголовков, таких как идентификатор клиента и значение секрета клиента, вам потребуется выполнить прокси-запрос каким-то образом.

<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">ApiKeyHeader</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="x-functions-key" StorageReferenceId="B2C_1A_RestApiKey" />
  </CryptographicKeys>
</TechnicalProfile>

Возврат сообщения об ошибке проверки

REST API может потребоваться вернуть сообщение об ошибке, например "Пользователь не найден в системе CRM". Если возникает ошибка, REST API должен вернуть сообщение об ошибке HTTP 4xx, например 400 (неправильный запрос) или код состояния ответа 409 (конфликт). Текст ответа содержит сообщение об ошибке в формате JSON:

{
  "version": "1.0.0",
  "status": 409,
  "code": "API12345",
  "requestId": "50f0bd91-2ff4-4b8f-828f-00f170519ddb",
  "userMessage": "Message for the user",
  "developerMessage": "Verbose description of problem and how to fix it.",
  "moreInfo": "https://restapi/error/API12345/moreinfo"
}
Свойство Обязательно Описание
версия Да Версия REST API. Например: 1.0.1
статус Да Коды состояния HTTP-ответа, например число, и должно иметь значение 409. Служба REST может возвращать код состояния HTTP 4XX, но значение status , поданное в текст ответа в формате JSON, должно быть 409.
код нет Код ошибки от поставщика конечной точки RESTful, который отображается при DebugMode включении.
идентификатор запроса нет Идентификатор запроса от поставщика конечной точки RESTful, который отображается при DebugMode включении.
сообщение пользователя Да Сообщение об ошибке, отображаемое пользователю.
Сообщение разработчика нет Подробное описание проблемы и способы ее устранения, которое отображается при DebugMode включении.
подробнееИнформация нет Универсальный код ресурса (URI), указывающий на дополнительные сведения, отображаемые при DebugMode включении.

В следующем примере показан класс C#, который возвращает сообщение об ошибке:

public class ResponseContent
{
  public string Version { get; set; }
  public int Status { get; set; }
  public string Code { get; set; }
  public string UserMessage { get; set; }
  public string DeveloperMessage { get; set; }
  public string RequestId { get; set; }
  public string MoreInfo { get; set; }
}

Дальнейшие шаги

Примеры использования технического профиля RESTful см. в следующих статьях: