Как получить значение расширения open/directory в настраиваемой политике Azure AD B2C?

Я использую Microsoft Graph API для установки пользовательского значения (строки) для пользователя. Я пытался использовать как открытые, так и расширения каталога для хранения данных, и оба, кажется, отлично работают на уровне API, поскольку я могу вернуть данные пользователю.

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

Имя расширения — extension_{appId}_myString, оно было создано с помощью этого HTTP-вызова:

POST https://graph.microsoft.com/v1.0/applications/graph-app-object-id/extensionProperties

{
    "name": "myString",
    "dataType": "String",
    "targetObjects": [
        "User"
    ]
}

Я добавил определение типа претензии следующим образом:

<ClaimType Id = "myString">
    <DisplayName>This is my string</DisplayName>
    <DataType>string</DataType>
    <DefaultPartnerClaimTypes>
        <Protocol Name = "OpenIdConnect" PartnerClaimType = "extension_myString" />
        <Protocol Name = "OAuth2" PartnerClaimType = "extension_myString" />
    </DefaultPartnerClaimTypes>
</ClaimType>

Мое определение пути пользователя:

<UserJourney Id = "SignIn">
    <OrchestrationSteps>
        <OrchestrationStep Order = "1" Type = "CombinedSignInAndSignUp" ContentDefinitionReferenceId = "api.selfasserted">
            <ClaimsProviderSelections>
                <ClaimsProviderSelection ValidationClaimsExchangeId = "LocalAccountSigninExchange" />
            </ClaimsProviderSelections>
            <ClaimsExchanges>
                 <ClaimsExchange Id = "LocalAccountSigninExchange" TechnicalProfileReferenceId = "LocalAccountDiscoveryUsingID" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order = "2" Type = "ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id = "AADUserReadWithObjectId" TechnicalProfileReferenceId = "AAD-UserReadUsingObjectId" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order = "3" Type = "SendClaims" CpimIssuerTechnicalProfileReferenceId = "JwtIssuer" />
    </OrchestrationSteps>
    <ClientDefinition ReferenceId = "DefaultWeb" />
</UserJourney>

Я добавил это выходное требование в технические профили шагов 1 и 2:

<OutputClaim ClaimTypeReferenceId = "myString" PartnerClaimType = "extension_myString" />

В моем техническом профиле AAD-Common есть элементы метаданных идентификатора клиента b2c-extensions-app и идентификатора объекта, и я могу успешно завершить процесс аутентификации и перейти на экран JWT, но значение моего расширения там не отображается.

Я не понимаю, сделал ли я что-то не так или просто пропустил еще одно место, в которое следует добавить пользовательское требование, чтобы оно отображалось в токене. Есть ли какой-то способ «распечатать» значение утверждения, чтобы увидеть, присутствует ли оно во время выполнения политики? По крайней мере, я знаю, что значение есть, и мне нужно только поместить его в токен.

Еще одна вещь, в которой я не уверен, — это создание значения расширения через Graph API. Я использовал учетные данные графического приложения для получения токена Graph API, а также использовал его идентификатор объекта для создания расширения каталога для пользовательского объекта. С другой стороны, есть приложение b2c-extensions-app, которое запрашивает данные во время выполнения пользовательской политики. Насколько я понимаю, оба приложения работают с одним и тем же экземпляром Active Directory, поэтому это не должно быть проблемой, но, возможно, я что-то неправильно понял.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для настройки пользовательского утверждения в пользовательском профиле Azure B2C в соответствии с https://learn.microsoft.com/en-us/azure/active-directory-b2c/user-flow-custom-attributes?pivots=b2c-custom. -policy#create-a-custom-attribute-through-azure-portal, вы должны добавить к идентификатору типа утверждения префикс extension_, чтобы обеспечить правильное сопоставление данных.

  • В схеме утверждений требование должно быть определено как:

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

Спасибо

Я также пробовал это, но безуспешно. Я думаю, это как-то связано с тем, как я создал расширение каталога через Graph API. Также нет никаких документов о том, как получить значения открытых расширений, хотя это должно поддерживаться: learn.microsoft.com/en -нас/график/…

Danny Idlis 20.11.2022 17:21

Вы также добавили выходное требование в раздел проверяющей стороны?

Jas Suri - MSFT 21.11.2022 10:41

Да, под тегом проверяющей стороны у меня есть технический профиль с именем PolicyProfile, и его OutputClaims содержат тег <OutputClaim ClaimTypeReferenceId = "extension_myString" />

Danny Idlis 21.11.2022 10:55
Ответ принят как подходящий

Вы не можете. Открытые расширения поддерживаются API MS Graph. Политика B2C использует AAD Graph за кулисами, она может извлекать только старый тип атрибута расширения. Чтобы получить открытое расширение, вам нужно вызвать свой собственный API, который, в свою очередь, вызывает API MS Graph для получения этого открытого расширения.

Вместо использования открытого расширения используйте старый тип:

https://learn.microsoft.com/en-us/azure/active-directory-b2c/microsoft-graph-operations#application-extension-directory-extension-properties

https://learn.microsoft.com/en-us/graph/api/resources/extensionproperty?view=graph-rest-1.0

Теперь это имеет смысл! Мне просто нужно выяснить, почему я не могу прочитать расширение каталога и увидеть его в токене. Вы хоть представляете, что мне не хватает?

Danny Idlis 21.11.2022 12:23

Логика вашей политики в порядке, единственное, что может быть, это то, что вы должны создать расширение с тем же AppId/objectId, что и в AAD-Common. Также избавьтесь от DefaultPartnerClaimTypes в определении претензии.

Jas Suri - MSFT 22.11.2022 12:15

Это работает, большое спасибо! Единственное, что странно, это то, что если я обновляю расширение через MS Graph API и запускаю политику сразу после получения статуса 204, политика все равно возвращает старое значение, хотя она уже была успешно обновлена. Есть ли какой-то механизм синхронизации за кулисами? Потому что я ожидаю, что новое значение будет отражено немедленно.

Danny Idlis 22.11.2022 15:03

Он реплицируется через множество контроллеров домена в течение минуты. Если вы нажмете другой DC, где вы сделали обновление, вы получите старое значение обратно. Поведение ожидаемое.

Jas Suri - MSFT 22.11.2022 22:03

Другие вопросы по теме