Поделиться через


Настройка потока учетных данных владельца ресурса в Azure Active Directory B2C

Это важно

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

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

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

Предупреждение

Рекомендуется не использовать поток ROPC. В большинстве случаев более безопасные альтернативные варианты доступны и рекомендуется. Этот поток требует очень высокой степени доверия к приложению и несет риски, которые не присутствуют в других потоках. Этот поток следует использовать только при невозможности использовать другие, более безопасные потоки.

Заметки о потоке ROPC

В Azure Active Directory B2C (Azure AD B2C) поддерживаются следующие параметры:

  • Native Client: взаимодействие пользователей осуществляется во время аутентификации при выполнении кода на пользовательском устройстве. Устройство может быть мобильным приложением, которое работает в собственной операционной системе, например Android и iOS.
  • Общедоступный поток клиента: в вызове API отправляются только учетные данные пользователя, собранные приложением. Учетные данные приложения не отправляются.
  • Добавление новых утверждений: содержимое маркера идентификатора можно изменить, чтобы добавить новые утверждения.

Следующие потоки не поддерживаются:

  • Сервер —сервер: система защиты удостоверений нуждается в надежном IP-адресе, полученном из вызывающего объекта (собственного клиента) в рамках взаимодействия. В вызове API на стороне сервера используется только IP-адрес сервера. Если превышено динамическое пороговое значение неудачной проверки подлинности, система защиты идентификации может определить повторяющийся IP-адрес в качестве злоумышленника.
  • Конфиденциальный поток клиента: проверяется идентификатор клиента приложения, но секрет приложения не проверяется.

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

Регистрация приложения

Чтобы зарегистрировать приложение в клиенте Azure AD B2C, вы можете использовать новый унифицированный интерфейс регистрации приложений или интерфейс регистрации приложений (устаревшая версия). Узнайте больше о новом интерфейсе.

  1. Войдите на портал Azure.
  2. Убедитесь, что вы используете каталог, который содержит подписчика Azure AD B2C.
    1. На панели инструментов портала выберите значок Каталоги и подписки.
    2. В настройках портала на странице Каталоги и подписки найдите свой каталог Azure AD B2C в списке Имя каталога и выберите Переключить.
  3. На портале Azure найдите и выберите Azure AD B2C
  4. Выберите регистрации приложений и нажмите кнопку "Создать регистрацию".
  5. Введите имя приложения. Например, ROPC_Auth_app.
  6. Оставьте остальные значения как есть, а затем выберите Зарегистрировать.
  7. Запишите идентификатор приложения (клиента) для использования на следующем шаге.
  8. В разделе Управление выберите Проверка подлинности.
  9. Выберите "Попробовать" новый интерфейс (если показано).
  10. В разделе «Дополнительные параметры» и подразделе «Включить следующие мобильные и настольные потоки» выберите «Да», чтобы рассматривать приложение как публичный клиент. Этот параметр необходим для потока ROPC.
  11. Выберите Сохранить.
  12. В меню слева выберите "Манифест" , чтобы открыть редактор манифеста.
  13. Задайте для атрибута oauth2AllowImplicitFlowзначение true. Если атрибут не существует, добавьте его:
    "oauth2AllowImplicitFlow": true,
    
  14. Выберите Сохранить.

Создание потока пользователя владельца ресурса

  1. Войдите на портал Azure в качестве администратора потока пользователей с внешним идентификатором клиента Azure AD B2C.
  2. Если у вас есть доступ к нескольким клиентам, щелкните значок Настройки в верхнем меню, чтобы переключиться на клиент Azure AD B2C из меню Каталоги и подписки.
  3. В портале Azure найдите и выберите Azure AD B2C.
  4. Выберите потоки пользователей и выберите новый поток пользователя.
  5. Выберите "Войти", используя учетные данные пароля владельца ресурса (ROPC).
  6. В разделе "Версия" убедитесь, что выбрана предварительная версия , а затем нажмите кнопку "Создать".
  7. Укажите имя потока пользователя, например ROPC_Auth.
  8. В разделе "Утверждения приложения" выберите "Показать больше".
  9. Выберите параметры вашего приложения, такие как отображаемое имя, электронный адрес и поставщик идентификации.
  10. Нажмите кнопку "ОК" и нажмите кнопку "Создать".

Предпосылка

Если вы этого не сделали, узнайте, как использовать начальный пакет настраиваемой политики в начале работы с настраиваемыми политиками в Active Directory B2C.

Создание политики владельца ресурса

  1. Откройте файлTrustFrameworkExtensions.xml .

  2. В элементе BuildingBlocks найдите элемент ClaimsSchema , а затем добавьте следующие типы утверждений:

    <ClaimsSchema>
      <ClaimType Id="logonIdentifier">
        <DisplayName>User name or email address that the user can use to sign in</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="resource">
        <DisplayName>The resource parameter passes to the ROPC endpoint</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="refreshTokenIssuedOnDateTime">
        <DisplayName>An internal parameter used to determine whether the user should be permitted to authenticate again using their existing refresh token.</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="refreshTokensValidFromDateTime">
        <DisplayName>An internal parameter used to determine whether the user should be permitted to authenticate again using their existing refresh token.</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
    </ClaimsSchema>
    
  3. После УтвержденияSchema добавьте элемент ClaimsTransformations и его дочерние элементы в элемент BuildingBlocks :

    <ClaimsTransformations>
      <ClaimsTransformation Id="CreateSubjectClaimFromObjectID" TransformationMethod="CreateStringClaim">
        <InputParameters>
          <InputParameter Id="value" DataType="string" Value="Not supported currently. Use oid claim." />
        </InputParameters>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="sub" TransformationClaimType="createdClaim" />
        </OutputClaims>
      </ClaimsTransformation>
    
      <ClaimsTransformation Id="AssertRefreshTokenIssuedLaterThanValidFromDate" TransformationMethod="AssertDateTimeIsGreaterThan">
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="refreshTokenIssuedOnDateTime" TransformationClaimType="leftOperand" />
          <InputClaim ClaimTypeReferenceId="refreshTokensValidFromDateTime" TransformationClaimType="rightOperand" />
        </InputClaims>
        <InputParameters>
          <InputParameter Id="AssertIfEqualTo" DataType="boolean" Value="false" />
          <InputParameter Id="AssertIfRightOperandIsNotPresent" DataType="boolean" Value="true" />
        </InputParameters>
      </ClaimsTransformation>
    </ClaimsTransformations>
    
  4. Найдите элемент ClaimsProvider с отображаемым именемLocal Account SignIn и добавьте следующий технический профиль:

    <TechnicalProfile Id="ResourceOwnerPasswordCredentials-OAUTH2">
      <DisplayName>Local Account SignIn</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <Metadata>
        <Item Key="UserMessageIfClaimsPrincipalDoesNotExist">We can't seem to find your account</Item>
        <Item Key="UserMessageIfInvalidPassword">Your password is incorrect</Item>
        <Item Key="UserMessageIfOldPasswordUsed">Looks like you used an old password</Item>
        <Item Key="DiscoverMetadataByTokenIssuer">true</Item>
        <Item Key="ValidTokenIssuerPrefixes">https://sts.windows.net/</Item>
        <Item Key="METADATA">https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration</Item>
        <Item Key="authorization_endpoint">https://login.microsoftonline.com/{tenant}/oauth2/token</Item>
        <Item Key="response_types">id_token</Item>
        <Item Key="response_mode">query</Item>
        <Item Key="scope">email openid</Item>
        <Item Key="grant_type">password</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="logonIdentifier" PartnerClaimType="username" Required="true" DefaultValue="{OIDC:Username}"/>
        <InputClaim ClaimTypeReferenceId="password" Required="true" DefaultValue="{OIDC:Password}" />
        <InputClaim ClaimTypeReferenceId="grant_type" DefaultValue="password" />
        <InputClaim ClaimTypeReferenceId="scope" DefaultValue="openid" />
        <InputClaim ClaimTypeReferenceId="nca" PartnerClaimType="nca" DefaultValue="1" />
        <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="ProxyIdentityExperienceFrameworkAppId" />
        <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="IdentityExperienceFrameworkAppId" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid" />
        <OutputClaim ClaimTypeReferenceId="userPrincipalName" PartnerClaimType="upn" />
      </OutputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromObjectID" />
      </OutputClaimsTransformations>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
    </TechnicalProfile>
    

    Замените defaultValueclient_id идентификатором приложения ProxyIdentityExperienceFramework, созданного в руководстве по предварительным требованиям. Затем замените DefaultValueresource_id идентификатором приложения IdentityExperienceFramework, созданного в руководстве по предварительным требованиям.

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

    <ClaimsProvider>
      <DisplayName>Azure Active Directory</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="AAD-UserReadUsingObjectId-CheckRefreshTokenDate">
          <Metadata>
            <Item Key="Operation">Read</Item>
            <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
          </Metadata>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="objectId" Required="true" />
          </InputClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="objectId" />
            <OutputClaim ClaimTypeReferenceId="refreshTokensValidFromDateTime" />
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="AssertRefreshTokenIssuedLaterThanValidFromDate" />
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromObjectID" />
          </OutputClaimsTransformations>
          <IncludeTechnicalProfile ReferenceId="AAD-Common" />
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
    <ClaimsProvider>
      <DisplayName>Session Management</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="SM-RefreshTokenReadAndSetup">
          <DisplayName>Trustframework Policy Engine Refresh Token Setup Technical Profile</DisplayName>
          <Protocol Name="None" />
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="objectId" />
            <OutputClaim ClaimTypeReferenceId="refreshTokenIssuedOnDateTime" />
          </OutputClaims>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
    <ClaimsProvider>
      <DisplayName>Token Issuer</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="JwtIssuer">
          <Metadata>
            <!-- Point to the redeem refresh token user journey-->
            <Item Key="RefreshTokenUserJourneyId">ResourceOwnerPasswordCredentials-RedeemRefreshToken</Item>
          </Metadata>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  6. Добавьте элемент UserJourneys и его дочерние элементы в элемент TrustFrameworkPolicy :

    <UserJourney Id="ResourceOwnerPasswordCredentials">
      <PreserveOriginalAssertion>false</PreserveOriginalAssertion>
      <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="ResourceOwnerFlow" TechnicalProfileReferenceId="ResourceOwnerPasswordCredentials-OAUTH2" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
      </OrchestrationSteps>
    </UserJourney>
    <UserJourney Id="ResourceOwnerPasswordCredentials-RedeemRefreshToken">
      <PreserveOriginalAssertion>false</PreserveOriginalAssertion>
      <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="RefreshTokenSetupExchange" TechnicalProfileReferenceId="SM-RefreshTokenReadAndSetup" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="CheckRefreshTokenDateFromAadExchange" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId-CheckRefreshTokenDate" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
      </OrchestrationSteps>
    </UserJourney>
    
  7. На странице "Пользовательские политики " в клиенте Azure AD B2C выберите " Отправить политику".

  8. Включите перезапись политики, если она существует, а затем перейдите и выберите файл TrustFrameworkExtensions.xml .

  9. Выберите Загрузить.

Создание файла проверяющей стороны

Затем обновите файл проверяющей стороны, который инициирует созданное путешествие пользователя:

  1. Создайте копию файлаSignUpOrSignin.xml в рабочем каталоге и переименуйте его в ROPC_Auth.xml.

  2. Откройте новый файл и измените значение атрибута PolicyId для TrustFrameworkPolicy на уникальное значение. Идентификатор политики — это имя политики. Например, B2C_1A_ROPC_Auth.

  3. Измените значение атрибута ReferenceId в DefaultUserJourneyResourceOwnerPasswordCredentialsна .

  4. Измените элемент OutputClaims , чтобы содержать только следующие утверждения:

    <OutputClaim ClaimTypeReferenceId="sub" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="displayName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="givenName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="surname" DefaultValue="" />
    
  5. На странице "Пользовательские политики " в клиенте Azure AD B2C выберите " Отправить политику".

  6. Включите перезапись политики, если она существует, а затем перейдите и выберите файл ROPC_Auth.xml .

  7. Выберите Загрузить.

Тестирование потока ROPC

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

https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1A_ROPC_Auth/oauth2/v2.0/token

  • Замените <tenant-name> именем клиента Azure AD B2C.
  • Замените B2C_1A_ROPC_Auth полным именем политики учетных данных владельца ресурса.
Ключ Ценность
имя пользователя user-account
пароль password1
тип предоставления пароль
охват openid application-id offline-доступ
идентификатор клиента application-id
тип_ответа маркер id_token
  • Замените user-account именем учетной записи пользователя в клиенте.
  • Замените password1 паролем учетной записи пользователя.
  • Замените application-id идентификатором приложения из регистрации ROPC_Auth_app .
  • Offline_access является необязательным, если вы хотите получить маркер обновления.

Фактический запрос POST выглядит следующим образом:

POST /<tenant-name>.onmicrosoft.com/B2C_1A_ROPC_Auth/oauth2/v2.0/token HTTP/1.1
Host: <tenant-name>.b2clogin.com
Content-Type: application/x-www-form-urlencoded

username=contosouser.outlook.com.ws&password=Passxword1&grant_type=password&scope=openid+00001111-aaaa-2222-bbbb-3333cccc4444+offline_access&client_id=00001111-aaaa-2222-bbbb-3333cccc4444&response_type=token+id_token

Успешный ответ с автономным доступом выглядит следующим образом:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9YQjNhdTNScWhUQWN6R0RWZDM5djNpTmlyTWhqN2wxMjIySnh6TmgwRlki...",
    "token_type": "Bearer",
    "expires_in": "3600",
    "refresh_token": "eyJraWQiOiJacW9pQlp2TW5pYVc2MUY0TnlfR3REVk1EVFBLbUJLb0FUcWQ1ZWFja1hBIiwidmVyIjoiMS4wIiwiemlwIjoiRGVmbGF0ZSIsInNlciI6Ij...",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9YQjNhdTNScWhUQWN6R0RWZDM5djNpTmlyTWhqN2wxMjIySnh6TmgwRlki..."
}

Получение токена обновления

Создайте вызов POST, как показано здесь. Используйте сведения в следующей таблице в качестве текста запроса:

https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1A_ROPC_Auth/oauth2/v2.0/token

  • Замените <tenant-name> именем клиента Azure AD B2C.
  • Замените B2C_1A_ROPC_Auth полным именем политики учетных данных владельца ресурса.
Ключ Ценность
тип предоставления рефреш_токен
тип_ответа идентификационный_токен
идентификатор клиента application-id
ресурс application-id
рефреш_токен refresh-token
  • Замените application-id идентификатором приложения из регистрации ROPC_Auth_app .
  • Замените refresh-token на refresh_token, отправленный в предыдущем ответе.

Успешный ответ выглядит следующим образом:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhT...",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQn...",
    "token_type": "Bearer",
    "not_before": 1533672990,
    "expires_in": 3600,
    "expires_on": 1533676590,
    "resource": "bef2222d56-552f-4a5b-b90a-1988a7d634c3",
    "id_token_expires_in": 3600,
    "profile_info": "eyJ2ZXIiOiIxLjAiLCJ0aWQiOiI1MTZmYzA2NS1mZjM2LTRiOTMtYWE1YS1kNmVlZGE3Y2JhYzgiLCJzdWIiOm51bGwsIm5hbWUiOiJEYXZpZE11IiwicHJlZmVycmVkX3VzZXJuYW1lIjpudWxsLCJpZHAiOiJMb2NhbEFjY291bnQifQ",
    "refresh_token": "eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAi...",
    "refresh_token_expires_in": 1209600
}

Устранение неполадок

Предоставленное приложение не настроено для разрешения неявного потока OAuth

  • Симптом - Вы запускаете поток ROPC и получаете следующее сообщение: AADB2C90057: предоставленное приложение не настроено для использования неявного потока OAuth.
  • Возможные причины . Неявный поток не допускается для приложения.
  • Решение. При создании регистрации приложения в Azure AD B2C необходимо вручную изменить манифест приложения и задать значение oauth2AllowImplicitFlow свойства true. После настройки oauth2AllowImplicitFlow свойства может потребоваться несколько минут (обычно не более пяти) для принятия изменений.

Использование встроенного SDK или App-Auth

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