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


Напишите первую настраиваемую политику Azure Active Directory B2C — Hello World!

В приложении можно использовать потоки пользователей, позволяющие пользователям регистрироваться, выполнять вход или управлять своим профилем. Если потоки пользователей не охватывают все бизнес-потребности, можно использовать пользовательские политики.

Хотя вы можете использовать предварительно созданный начальный пакет политики для написания пользовательских политик, важно понимать, как создается настраиваемая политика. Из этой статьи вы узнаете, как создать первую настраиваемую политику с нуля.

Необходимые компоненты

Примечание.

Эта статья является частью серии руководств по созданию и запуску собственных пользовательских политик в Azure Active Directory B2C. Мы рекомендуем начать эту серию из первой статьи.

Шаг 1. Настройка ключей подписи и шифрования

Если вы еще этого не сделали, создайте следующие ключи шифрования. Чтобы автоматизировать приведенные ниже инструкции, посетите приложение установки IEF и следуйте инструкциям.

  1. Чтобы создать ключ подписи, выполните действия, описанные в разделе "Добавление ключей подписывания и шифрования для приложений Identity Experience Framework".

  2. Чтобы создать ключ шифрования, выполните действия, описанные в разделе "Добавление ключей подписывания и шифрования для приложений Identity Experience Framework".

Шаг 2. Создание пользовательского файла политики

  1. В VS Code создайте и откройте файл ContosoCustomPolicy.XML.

  2. Добавьте в файл ContosoCustomPolicy.XML указанный ниже код:

        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <TrustFrameworkPolicy
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06"
          PolicySchemaVersion="0.3.0.0"
          TenantId="yourtenant.onmicrosoft.com"
          PolicyId="B2C_1A_ContosoCustomPolicy"
          PublicPolicyUri="http://yourtenant.onmicrosoft.com/B2C_1A_ContosoCustomPolicy">
    
            <BuildingBlocks>
                <!-- Building Blocks Here-->
            </BuildingBlocks>
    
            <ClaimsProviders>
                <!-- Claims Providers Here-->
            </ClaimsProviders>
    
            <UserJourneys>
                <!-- User Journeys Here-->
            </UserJourneys>
    
            <RelyingParty>
                <!-- 
                    Relying Party Here that's your policy’s entry point
                    Specify the User Journey to execute 
                    Specify the claims to include in the token that is returned when the policy runs
                -->
            </RelyingParty>
        </TrustFrameworkPolicy>
    
    

    Замените yourtenant поддомен частью имени клиента, например contoso. См. раздел Получение имени клиента.

    XML-элементы определяют элемент верхнего уровня TrustFrameworkPolicy файла политики с его идентификатором политики и именем клиента. Элемент TrustFrameworkPolicy содержит другие XML-элементы, которые будут использоваться в этой серии.

  3. Чтобы объявить утверждение, добавьте следующий код в BuildingBlocks разделе ContosoCustomPolicy.XML файла:

      <ClaimsSchema>
        <ClaimType Id="objectId">
            <DisplayName>unique object Id for subject of the claims being returned</DisplayName>
            <DataType>string</DataType>
        </ClaimType>        
        <ClaimType Id="message">
            <DisplayName>Will hold Hello World message</DisplayName>
            <DataType>string</DataType>
        </ClaimType>
      </ClaimsSchema>
    

    Утверждение похоже на переменную. Объявление утверждения также показывает тип данных утверждения.

  4. ClaimsProviders В разделе ContosoCustomPolicy.XML файла добавьте следующий код:

        <ClaimsProvider>
          <DisplayName>Token Issuer</DisplayName>
          <TechnicalProfiles>
            <TechnicalProfile Id="JwtIssuer">
              <DisplayName>JWT Issuer</DisplayName>
              <Protocol Name="None" />
              <OutputTokenFormat>JWT</OutputTokenFormat>
              <Metadata>
                <Item Key="client_id">{service:te}</Item>
                <Item Key="issuer_refresh_token_user_identity_claim_type">objectId</Item>
                <Item Key="SendTokenResponseBodyWithJsonNumbers">true</Item>
              </Metadata>
              <CryptographicKeys>
                <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
                <Key Id="issuer_refresh_token_key" StorageReferenceId="B2C_1A_TokenEncryptionKeyContainer" />
              </CryptographicKeys>
            </TechnicalProfile>
          </TechnicalProfiles>
        </ClaimsProvider>
    
        <ClaimsProvider>
          <!-- The technical profile(s) defined in this section is required by the framework to be included in all custom policies. -->
          <DisplayName>Trustframework Policy Engine TechnicalProfiles</DisplayName>
          <TechnicalProfiles>
            <TechnicalProfile Id="TpEngine_c3bd4fe2-1775-4013-b91d-35f16d377d13">
              <DisplayName>Trustframework Policy Engine Default Technical Profile</DisplayName>
              <Protocol Name="None" />
              <Metadata>
                <Item Key="url">{service:te}</Item>
              </Metadata>
            </TechnicalProfile>
          </TechnicalProfiles>
        </ClaimsProvider>
    

    Мы объявили издателя токена JWT. CryptographicKeys В разделе, если вы использовали разные имена для настройки ключей подписи и шифрования на шаге 1, убедитесь, что для этого StorageReferenceIdиспользуется правильное значение.

  5. UserJourneys В разделе ContosoCustomPolicy.XML файла добавьте следующий код:

      <UserJourney Id="HelloWorldJourney">
        <OrchestrationSteps>
          <OrchestrationStep Order="1" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
        </OrchestrationSteps>
      </UserJourney>
    

    Мы добавили UserJourney. Путешествие пользователя указывает бизнес-логику, через который пользователь проходит, как Azure AD B2C обрабатывает запрос. Этот путь пользователя имеет только один шаг, который выдает маркер JTW с утверждениями, которые вы определите на следующем шаге.

  6. RelyingParty В разделе ContosoCustomPolicy.XML файла добавьте следующий код:

      <DefaultUserJourney ReferenceId="HelloWorldJourney"/>
      <TechnicalProfile Id="HelloWorldPolicyProfile">
        <DisplayName>Hello World Policy Profile</DisplayName>
        <Protocol Name="OpenIdConnect" />
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" DefaultValue="abcd-1234-efgh-5678-ijkl-etc."/>
          <OutputClaim ClaimTypeReferenceId="message" DefaultValue="Hello World!"/>
        </OutputClaims>
        <SubjectNamingInfo ClaimType="sub" />
      </TechnicalProfile>
    

    Раздел RelyingParty — это точка входа в политику. Он указывает userJourney для выполнения и утверждения для включения в токен, возвращаемый при выполнении политики.

После завершения шага 2ContosoCustomPolicy.XML файл должен выглядеть следующим образом:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TrustFrameworkPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06" PolicySchemaVersion="0.3.0.0" TenantId="Contosob2c2233.onmicrosoft.com" PolicyId="B2C_1A_ContosoCustomPolicy" PublicPolicyUri="http://Contosob2c2233.onmicrosoft.com/B2C_1A_ContosoCustomPolicy">
        <BuildingBlocks>
            <ClaimsSchema>
            <ClaimType Id="objectId">
                <DisplayName>unique object Id for subject of the claims being returned</DisplayName>
                <DataType>string</DataType>
            </ClaimType>        
            <ClaimType Id="message">
                <DisplayName>Will hold Hello World message</DisplayName>
                <DataType>string</DataType>
            </ClaimType>
            </ClaimsSchema>
        </BuildingBlocks>
        <ClaimsProviders><!--Claims Providers Here-->
            <ClaimsProvider>
                <DisplayName>Token Issuer</DisplayName>
                <TechnicalProfiles>
                    <TechnicalProfile Id="JwtIssuer">
                        <DisplayName>JWT Issuer</DisplayName>
                        <Protocol Name="None"/>
                        <OutputTokenFormat>JWT</OutputTokenFormat>
                        <Metadata>
                            <Item Key="client_id">{service:te}</Item>
                            <Item Key="issuer_refresh_token_user_identity_claim_type">objectId</Item>
                            <Item Key="SendTokenResponseBodyWithJsonNumbers">true</Item>
                        </Metadata>
                        <CryptographicKeys>
                            <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer"/>
                            <Key Id="issuer_refresh_token_key" StorageReferenceId="B2C_1A_TokenEncryptionKeyContainer"/>
                        </CryptographicKeys>
                    </TechnicalProfile>
                </TechnicalProfiles>
            </ClaimsProvider>
    
            <ClaimsProvider>
            <DisplayName>Trustframework Policy Engine TechnicalProfiles</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="TpEngine_c3bd4fe2-1775-4013-b91d-35f16d377d13">
                <DisplayName>Trustframework Policy Engine Default Technical Profile</DisplayName>
                <Protocol Name="None" />
                <Metadata>
                    <Item Key="url">{service:te}</Item>
                </Metadata>
                </TechnicalProfile>
            </TechnicalProfiles>
            </ClaimsProvider>
        </ClaimsProviders>
      <UserJourneys>
        <UserJourney Id="HelloWorldJourney">
          <OrchestrationSteps>
            <OrchestrationStep Order="1" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
          </OrchestrationSteps>
        </UserJourney>
      </UserJourneys>
        <RelyingParty><!-- 
                Relying Party Here that's your policy’s entry point
                Specify the User Journey to execute 
                Specify the claims to include in the token that is returned when the policy runs
            -->
            <DefaultUserJourney ReferenceId="HelloWorldJourney"/>
            <TechnicalProfile Id="HelloWorldPolicyProfile">
                <DisplayName>Hello World Policy Profile</DisplayName>
                <Protocol Name="OpenIdConnect"/>
                <OutputClaims>
                    <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" DefaultValue="abcd-1234-efgh-5678-ijkl-etc."/>
                    <OutputClaim ClaimTypeReferenceId="message" DefaultValue="Hello World!"/>
                </OutputClaims>
                <SubjectNamingInfo ClaimType="sub"/>
            </TechnicalProfile>
        </RelyingParty>
    </TrustFrameworkPolicy>

Шаг 3. Отправка пользовательского файла политики

  1. Войдите на портал Azure.
  2. Если у вас есть доступ к нескольким клиентам, выберите значок Параметры в верхнем меню, чтобы переключиться на клиент Azure AD B2C из меню каталогов и подписок.
  3. В портале Azure найдите и выберите Azure AD B2C.
  4. В меню слева в разделе "Политики" выберите "Платформа удостоверений".
  5. Выберите "Отправить настраиваемую ContosoCustomPolicy.XML политику", перейдите по экрану и отправьте файл.

После отправки файла Azure AD B2C добавляет префикс B2C_1A_, поэтому имена похожи на B2C_1A_CONTOSOCUSTOMPOLICY.

Шаг 4. Проверка настраиваемой политики

  1. В разделе "Пользовательские политики" выберите B2C_1A_CONTOSOCUSTOMPOLICY.
  2. Для выбора приложения на странице обзора настраиваемой политики выберите веб-приложение , например webapp1 , которое вы ранее зарегистрировали. Убедитесь, что для параметра Select reply URL заданоhttps://jwt.ms значение URL-адреса ответа.
  3. Нажмите кнопку "Запустить сейчас ".

После завершения выполнения политики вы будете перенаправлены https://jwt.msв , и вы увидите декодированные токены JWT. Он выглядит примерно так, как показано в следующем фрагменте маркера JWT:

    {
      "typ": "JWT",
      "alg": "RS256",
      "kid": "pxLOMWFg...."
    }.{
      ...
      "sub": "abcd-1234-efgh-5678-ijkl-etc.",
      ...
      "acr": "b2c_1a_contosocustompolicy",
      ...
      "message": "Hello World!"
    }.[Signature]

Обратите внимание на message утверждения и sub утверждения, которые мы устанавливаем в качестве выходных утверждений RelyingParty в разделе.

Следующие шаги

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

  • BuildingBlocks
  • ClaimsProviders
  • UserJourneys
  • RelyingParty

Далее вы узнаете: