В настоящее время мы используем Azure B2 C для аутентификации с помощью приложения React. js. Используемая нами библиотека - это msal. js.
Изначально мы использовали стандартный поток пользователей с включенным SSO, а библиотека msal js работала правильно (и продолжает работать). В этом потоке приложений первый вызов B2 C будет запрашивать id_token, а затем инициировать второй вызов в iframe, который автоматически сработает, потому что пользователь уже вошел в систему. Все это произойдет автоматически, и пользователь просто увидеть себя вошедшим без проблем. В этом случае вызов для аутентификации в iframe возвращает 302 назад нашему приложению с access_token для доступа к нашему API.
Теперь мы перешли на пользовательскую политику для настройки страницы входа и использования * 1046. *. Это было настроено с использованием пользовательских политик и правильно работает с многофакторной аутентификацией для входа в систему. Поток работает следующим образом:
- Первый вызов msal. js превращается в B2 C (/ authorize ) вызывает запрос id_token и корректно следует потоку для входа в систему.
- Второй вызов B2 C (/ authorize) также выполняется в iframe, но вместо возврата 302, он возвращает значение 200, которое затем (правильно) не отображается, поскольку заголовок, отправленный из B2 C, включает параметры X-Frame-Options: заголовок deny
- MSAL ждет 6 секунд для возврата iframe, и потому что это не так, то инициирует перенаправление на страницу входа для токена доступа, который работает, но требует от пользователя дважды войти в систему.
Все это происходит (я полагаю), потому что SSO неправильно работает с пользовательской политикой. В первом сценарии с потоком пользователей из B2 C SSO запускается и автоматически перенаправляет пользователя обратно в приложение с токеном доступа, во втором, поскольку SSO не работает, пользователь должен войти в систему дважды.
Моя настраиваемая политика выглядит следующим образом, построенная на примерах, приведенных в (очень редкой) документации для настраиваемых политик с B2 C:
- Технический профиль существует и выглядит как следующее:
<TechnicalProfile Id="SM-AAD">
<DisplayName>Session Mananagement Provider</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.DefaultSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<PersistedClaims>
<PersistedClaim ClaimTypeReferenceId="objectId" />
<PersistedClaim ClaimTypeReferenceId="signInName" />
<PersistedClaim ClaimTypeReferenceId="authenticationSource" />
<PersistedClaim ClaimTypeReferenceId="identityProvider" />
<PersistedClaim ClaimTypeReferenceId="newUser" />
<PersistedClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" />
</PersistedClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectIdFromSession" DefaultValue="true"/>
</OutputClaims>
</TechnicalProfile>
- Каждый из технических профилей, которые используются для чтения и записи информации в каталог, ссылаются на этот технический профиль, например.
<TechnicalProfile Id="AAD-UserWriteUsingLogonEmail">
...
<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>
- В моем файле профиля (SignUpOfSignIn. xml) у меня есть следующее под
<UserJourneyBehaviors>
<SingleSignOn Scope="Tenant" KeepAliveInDays="7" />
<SessionExpiryType>Absolute</SessionExpiryType>
<SessionExpiryInSeconds>1200</SessionExpiryInSeconds>
<ScriptExecution>Allow</ScriptExecution>
</UserJourneyBehaviors>
- В моем UserJourney для этой пользовательской политики каждый шаг оркестровки относится к техническому профилю, который включает в себя технический профиль SM-AAD для управления сеансом, за исключением PhoneFactor (который использует собственный технический профиль SM-MFA, для которого isActiveMfaSession имеет значение true)
Несмотря на все это Я не могу настроить единый вход для правильной работы с пользовательским профилем. Одна вещь, которую я заметил, - то, что ClaimType "objectIdFromSession", который является частью профиля SSO, не используется. Я бы подумал, что это будет использовано для определения того, следует ли пропустить этап оркестровки, верно ли это?
Любая другая помощь или подсказки относительно того, что может быть неправильным, будет принята с благодарностью.