Добавление атрибутов пользователя и настройка ввода данных пользователем в Azure Active Directory B2C

Прежде чем начать работу _, используйте селектор _ Choose a policy type (Выбрать тип политики), чтобы выбрать тип настраиваемой политики. Azure Active Directory B2C предлагает два метода определения способа взаимодействия пользователей с вашими приложениями: с помощью предопределенных потоков пользователей или полностью настраиваемых пользовательских политик. Действия, которые необходимо выполнить, отличаются для каждого метода.

В этой статье вы соберете новый атрибут при регистрации в Azure Active Directory B2C (Azure AD B2C). Вы получите город пользователя, настроите его в виде раскрывающегося списка и определите, нужно ли его указывать.

Важно!

В этом примере используется встроенное утверждение city. Вместо этого можно выбрать один из поддерживаемых встроенных атрибутов Azure AD B2C или пользовательский атрибут. Чтобы использовать настраиваемый атрибут, включите настраиваемые атрибуты. Чтобы использовать другой встроенный или настраиваемый атрибут, замените city на желаемый атрибут, например встроенный атрибут jobTitle или настраиваемый атрибут, такой как extension_loyaltyId.

Предварительные требования

Добавление атрибутов пользователя в поток пользователя

  1. Войдите на портал Azure.
  2. Убедитесь, что вы используете каталог, содержащий клиент Azure AD B2C. На панели инструментов портала выберите значок Каталоги и подписки.
  3. В настройках портала на странице Каталоги и подписки найдите свой каталог Azure AD B2C в списке Имя каталога и выберите Переключить.
  4. В разделе Службы Azure выберите Azure AD B2C. Или используйте поле поиска, чтобы найти и выбрать Azure AD B2C.
  5. В клиенте Azure AD B2C выберите Потоки пользователей.
  6. Откройте политику (например B2C_1_SignupSignin), щелкнув ее.
  7. Выберите Атрибуты пользователя, а затем атрибут пользователя (например, city).
  8. Щелкните Сохранить.

Предоставление дополнительных утверждений для приложения

Утверждения приложения — это значения, возвращаемые приложению. Обновите поток пользователя, чтобы он содержал нужные утверждения.

  1. Откройте политику (например B2C_1_SignupSignin), щелкнув ее.
  2. Выберите элемент Утверждения приложения.
  3. Выберите атрибуты, которые необходимо отправить обратно в приложение (например, city).
  4. Щелкните Сохранить.

Настройка типа входных данных в атрибутах пользователя

  1. Откройте политику (например B2C_1_SignupSignin), щелкнув ее.
  2. Выберите Макеты страниц.
  3. Выберите Страница регистрации локальной учетной записи.
  4. В разделе Атрибуты пользователя выберите city.
    1. В раскрывающемся списке Пользовательский тип ввода выберите DropdownSingleSelect. Необязательно: используйте кнопки "Переместить вверх/вниз" для упорядочения порядка текста на странице регистрации.
    2. В раскрывающемся списке Необязательно выберите Нет.
  5. Щелкните Сохранить.

Указание списка значений с помощью локализованных коллекций

Чтобы предоставить установленный список значений для атрибута city, выполните следующие действия.

  1. Включение настройки языка в потоке пользователя
  2. Откройте политику (например B2C_1_SignupSignin), щелкнув ее.
  3. На странице Языки для потока пользователя выберите язык, который требуется настроить.
  4. В разделе Файлы ресурсов на уровне страницы выберите страницу регистрации локальной учетной записи.
  5. Нажмите кнопку Скачать значения по умолчанию (или Скачать переопределения, если этот язык ранее менялся).
  6. Создайте атрибут LocalizedCollections.

LocalizedCollections является массивом пар Name и Value. Порядок размещения элементов определяет порядок их отображения.

  • ElementId представляет собой пользовательский атрибут, ответом на который является LocalizedCollections.
  • Name является значением, которое видит пользователь.
  • Value возвращается в утверждении при выборе этого параметра.
{
  "LocalizedStrings": [...],
  "LocalizedCollections": [
    {
      "ElementType": "ClaimType",
      "ElementId": "city",
      "TargetCollection": "Restriction",
      "Override": true,
      "Items": [
        {
          "Name": "Berlin",
          "Value": "Berlin"
        },
        {
          "Name": "London",
          "Value": "London"
        },
        {
          "Name": "Seattle",
          "Value": "Seattle"
        }
      ]
    }
  ]
}

Загрузка изменений

  1. Внеся изменения в JSON-файл, вернитесь к клиенту B2C.
  2. Выберите Потоки пользователей, а затем политику (например, B2C_1_SignupSignin), чтобы ее открыть.
  3. Щелкните Языки.
  4. Выберите язык, на который требуется выполнить перевод.
  5. В разделе Файлы ресурсов на уровне страницы выберите страницу регистрации локальной учетной записи.
  6. Щелкните значок папки и выберите JSON-файл для отправки. Изменения автоматически сохраняются в потоке пользователя.

Тестирование потока пользователя

  1. Откройте политику (например B2C_1_SignupSignin), щелкнув ее.
  2. Чтобы проверить политику, выберите Выполнить поток пользователя.
  3. В разделе Приложение выберите зарегистрированное ранее веб-приложение с именем testapp1. В поле URL-адрес ответа должно содержаться значение https://jwt.ms.
  4. Щелкните Выполнить поток пользователя.

Обзор

Вы можете собрать исходные данные у пользователей, используя такие пути взаимодействия пользователя, как регистрация или вход. Дополнительные утверждения можно собрать позже при редактировании профиля. Каждый раз, когда Azure AD B2C получает сведения непосредственно от пользователя в интерактивном режиме, он использует технический профиль с самостоятельным подтверждением. В этом примере вы сделаете следующее.

  1. Определите утверждение city.
  2. Попросите пользователя указать его город.
  3. Сохраните город в профиле пользователя в каталоге Azure AD B2C.
  4. Прочтете утверждение city из каталога Azure AD B2C при входе.
  5. Вернете город приложению проверяющей стороны после входа или регистрации.

Определение утверждения

Утверждение предоставляет временное хранилище данных на время выполнения политики Azure AD B2C. Схема утверждений — это место, где вы объявляете свои утверждения. Для определения утверждения используются такие элементы:

  • DisplayName — это строка, определяющая пользовательскую метку.
  • DataType — тип утверждения.
  • UserHelpText — позволяет пользователю узнать требования.
  • UserInputType — тип элемента управления вводом, например текстовое поле, переключатель, раскрывающийся список или множественный выбор.

Откройте файл расширения политики. Например, SocialAndLocalAccounts/TrustFrameworkExtensions.xml.

  1. Найдите элемент BuildingBlocks. Если такой элемент не существует, добавьте его.
  2. Найдите элемент ClaimsSchema. Если такой элемент не существует, добавьте его.
  3. Добавьте утверждение city в элемент ClaimsSchema.
<!-- 
<BuildingBlocks>
  <ClaimsSchema> -->
    <ClaimType Id="city">
      <DisplayName>City where you work</DisplayName>
      <DataType>string</DataType>
      <UserInputType>DropdownSingleSelect</UserInputType>
      <Restriction>
        <Enumeration Text="Berlin" Value="berlin" />
        <Enumeration Text="London" Value="london" />
        <Enumeration Text="Seattle" Value="seattle" />
      </Restriction>
    </ClaimType>
  <!-- 
  </ClaimsSchema>
</BuildingBlocks>-->

Включите атрибут SelectByDefault в элемент Enumeration, чтобы он выбирался по умолчанию при первой загрузке страницы. Например, чтобы настроить предварительный выбор элемента Лондон, измените элемент Enumeration, как показано в следующем примере.

<Restriction>
  <Enumeration Text="Berlin" Value="berlin" />
  <Enumeration Text="London" Value="london" SelectByDefault="true" />
  <Enumeration Text="Seattle" Value="seattle" />
</Restriction>

Добавление утверждения в пользовательский интерфейс

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

  • LocalAccountSignUpWithLogonEmail — поток регистрации локальной учетной записи.
  • SelfAsserted-Social — первый вход пользователя в федеративную учетную запись.
  • SelfAsserted-ProfileUpdate — поток изменения профиля.

Чтобы получить утверждение city во время регистрации, его необходимо добавить в технический профиль LocalAccountSignUpWithLogonEmail как исходящее утверждение. Переопределите технический профиль в файле расширения. Укажите полный список исходящих утверждений для управления порядком, в котором они представлены на экране. Найдите элемент ClaimsProviders. Добавьте новый элемент ClaimsProvider следующим образом.

<ClaimsProvider>
  <DisplayName>Local Account</DisplayName>
  <TechnicalProfiles>
    <!--Local account sign-up page-->
    <TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
      <OutputClaims>
       <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
       <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
       <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
       <OutputClaim ClaimTypeReferenceId="displayName" />
       <OutputClaim ClaimTypeReferenceId="givenName" />
       <OutputClaim ClaimTypeReferenceId="surName" />
       <OutputClaim ClaimTypeReferenceId="city"/>
     </OutputClaims>
   </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Чтобы получить утверждение city после первого входа в федеративную учетную запись, его нужно добавить как исходящее утверждение в технический профиль SelfAsserted-Social. Чтобы пользователи локальных и федеративных учетных записей могли изменить данные своего профиля позже, добавьте входящие и исходящие утверждения в технический профиль SelfAsserted-ProfileUpdate. Переопределите эти технические профили в файле расширения. Укажите полный список исходящих утверждений для управления порядком, в котором они представлены на экране. Найдите элемент ClaimsProviders. Добавьте новый элемент ClaimsProvider следующим образом.

<ClaimsProvider>
  <DisplayName>Self Asserted</DisplayName>
  <TechnicalProfiles>
    <!--Federated account first-time sign-in page-->
    <TechnicalProfile Id="SelfAsserted-Social">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="city" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="displayName"/>
        <OutputClaim ClaimTypeReferenceId="givenName"/>
        <OutputClaim ClaimTypeReferenceId="surname"/>
        <OutputClaim ClaimTypeReferenceId="city"/>
      </OutputClaims>
    </TechnicalProfile>
    <!--Edit profile page-->
    <TechnicalProfile Id="SelfAsserted-ProfileUpdate">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="city" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="displayName"/>
        <OutputClaim ClaimTypeReferenceId="givenName" />
        <OutputClaim ClaimTypeReferenceId="surname" />
        <OutputClaim ClaimTypeReferenceId="city"/>
      </OutputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Чтение и запись утверждения

Следующие технические профили являются техническими профилями Active Directory, которые считывают и записывают данные в Azure Active Directory.
Используйте PersistedClaims для записи данных в профиль пользователя и OutputClaims для чтения данных из профиля пользователя в соответствующих технических профилях Active Directory.

Переопределите эти технические профили в файле расширения. Найдите элемент ClaimsProviders. Добавьте новый элемент ClaimsProvider следующим образом.

<ClaimsProvider>
  <DisplayName>Azure Active Directory</DisplayName>
  <TechnicalProfiles>
    <!-- Write data during a local account sign-up flow. -->
    <TechnicalProfile Id="AAD-UserWriteUsingLogonEmail">
      <PersistedClaims>
        <PersistedClaim ClaimTypeReferenceId="city"/>
      </PersistedClaims>
    </TechnicalProfile>
    <!-- Write data during a federated account first-time sign-in flow. -->
    <TechnicalProfile Id="AAD-UserWriteUsingAlternativeSecurityId">
      <PersistedClaims>
        <PersistedClaim ClaimTypeReferenceId="city"/>
      </PersistedClaims>
    </TechnicalProfile>
    <!-- Write data during edit profile flow. -->
    <TechnicalProfile Id="AAD-UserWriteProfileUsingObjectId">
      <PersistedClaims>
        <PersistedClaim ClaimTypeReferenceId="city"/>
      </PersistedClaims>
    </TechnicalProfile>
    <!-- Read data after user resets the password. -->
    <TechnicalProfile Id="AAD-UserReadUsingEmailAddress">
      <OutputClaims>  
        <OutputClaim ClaimTypeReferenceId="city" />
      </OutputClaims>
    </TechnicalProfile>
    <!-- Read data after user authenticates with a local account. -->
    <TechnicalProfile Id="AAD-UserReadUsingObjectId">
      <OutputClaims>  
        <OutputClaim ClaimTypeReferenceId="city" />
      </OutputClaims>
    </TechnicalProfile>
    <!-- Read data after user authenticates with a federated account. -->
    <TechnicalProfile Id="AAD-UserReadUsingAlternativeSecurityId">
      <OutputClaims>  
        <OutputClaim ClaimTypeReferenceId="city" />
      </OutputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Включение утверждения в токен

Чтобы вернуть утверждение city в приложение проверяющей стороны, добавьте выходное утверждение в файл SocialAndLocalAccounts/SignUpOrSignIn.xml. Исходящее утверждение будет добавлено в маркер после успешного пути взаимодействия пользователя и отправлено в приложение. Измените элемент технического профиля в разделе проверяющей стороны, чтобы добавить city в качестве исходящего утверждения.

<RelyingParty>
  <DefaultUserJourney ReferenceId="SignUpOrSignIn" />
  <TechnicalProfile Id="PolicyProfile">
    <DisplayName>PolicyProfile</DisplayName>
    <Protocol Name="OpenIdConnect" />
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="displayName" />
      <OutputClaim ClaimTypeReferenceId="givenName" />
      <OutputClaim ClaimTypeReferenceId="surname" />
      <OutputClaim ClaimTypeReferenceId="email" />
      <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
      <OutputClaim ClaimTypeReferenceId="identityProvider" />
      <OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />
      <OutputClaim ClaimTypeReferenceId="city" DefaultValue="" />
    </OutputClaims>
    <SubjectNamingInfo ClaimType="sub" />
  </TechnicalProfile>
</RelyingParty>

Передача и проверка обновленной настраиваемой политики

  1. Убедитесь, что вы используете каталог, содержащий клиент Azure AD B2C. На панели инструментов портала выберите значок Каталоги и подписки.
  2. В настройках портала на странице Каталоги и подписки найдите свой каталог Azure AD B2C в списке Имя каталога и выберите Переключить.
  3. Найдите и выберите Azure AD B2C.
  4. В разделе Политики выберите Identity Experience Framework.
  5. Выберите Отправить пользовательскую политику.
  6. Отправьте измененные ранее файлы политики.

Проверка пользовательской политики

  1. Выберите политику проверяющей стороны, например B2C_1A_signup_signin.
  2. В разделе Приложение выберите зарегистрированное ранее веб-приложение. В поле URL-адрес ответа должно содержаться значение https://jwt.ms.
  3. Нажмите кнопку Выполнить.
  4. На странице регистрации или входа выберите Зарегистрироваться сейчас, чтобы зарегистрироваться. Завершите ввод сведений о пользователе, включая название города, и нажмите кнопку Создать. Вы увидите содержимое возвращенного маркера.

Экран регистрации должен выглядеть примерно следующим образом.

Снимок экрана с измененным вариантом регистрации

Токен, отправленный обратно в ваше приложение, включает утверждение city.

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "exp": 1583500140,
  "nbf": 1583496540,
  "ver": "1.0",
  "iss": "https://contoso.b2clogin.com/f06c2fe8-709f-4030-85dc-38a4bfd9e82d/v2.0/",
  "aud": "e1d2612f-c2bc-4599-8e7b-d874eaca1ee1",
  "acr": "b2c_1a_signup_signin",
  "nonce": "defaultNonce",
  "iat": 1583496540,
  "auth_time": 1583496540,
  "name": "Emily Smith",
  "email": "joe@outlook.com",
  "given_name": "Emily",
  "family_name": "Smith",
  "city": "Berlin"
  ...
}

(Необязательно). Локализация пользовательского интерфейса

Azure AD B2C позволяет адаптировать политику к различным языкам. Для получения дополнительных сведений узнайте о настройке языкового интерфейса. Чтобы локализовать страницу регистрации, настройте список поддерживаемых языков и укажите метки, зависящие от языка.

Примечание

При использовании LocalizedCollection с метками, зависящими от языка, вы можете удалить коллекцию Restriction из определения утверждения.

В следующем примере показано, как предоставить список городов для английского и испанского языков. Оба они устанавливают коллекцию Restriction для утверждения city со списком элементов на английском и испанском языках. SelectByDefault задает выбор элемента по умолчанию при первой загрузке страницы.

<!-- 
<BuildingBlocks>-->
  <Localization Enabled="true">
    <SupportedLanguages DefaultLanguage="en" MergeBehavior="Append">
      <SupportedLanguage>en</SupportedLanguage>
      <SupportedLanguage>es</SupportedLanguage>
    </SupportedLanguages>
    <LocalizedResources Id="api.localaccountsignup.en">
      <LocalizedCollections>
        <LocalizedCollection ElementType="ClaimType" ElementId="city" TargetCollection="Restriction">
          <Item Text="Berlin" Value="Berlin"></Item>
          <Item Text="London" Value="London" SelectByDefault="true"></Item>
          <Item Text="Seattle" Value="Seattle"></Item>
        </LocalizedCollection>
      </LocalizedCollections>
    </LocalizedResources>
    <LocalizedResources Id="api.localaccountsignup.es">
      <LocalizedCollections>
        <LocalizedCollection ElementType="ClaimType" ElementId="city" TargetCollection="Restriction">
          <Item Text="Berlina" Value="Berlin"></Item>
          <Item Text="Londres" Value="London" SelectByDefault="true"></Item>
          <Item Text="Seattle" Value="Seattle"></Item>
        </LocalizedCollection>
      </LocalizedCollections>
    </LocalizedResources>
  </Localization>
<!-- 
</BuildingBlocks>-->

После добавления элемента локализации измените определение содержимого с помощью локализации. В следующем примере для страницы регистрации добавляются локализованные ресурсы на английском (en) и испанском (es) языках.

<!-- 
<BuildingBlocks>
  <ContentDefinitions> -->
   <ContentDefinition Id="api.localaccountsignup">
    <LocalizedResourcesReferences MergeBehavior="Prepend">
        <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.localaccountsignup.en" />
        <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.localaccountsignup.es" />
    </LocalizedResourcesReferences>
   </ContentDefinition>
  <!-- 
  </ContentDefinitions>
</BuildingBlocks>-->

Дальнейшие действия