Я включил поток подписки с приглашением по электронной почте в свой проект, следуя этому Azure AD B2 C образцу от Microsoft:
https://github.com/azure-ad-b2c/samples/tree/master/policies/invite
По тестовым причинам я устанавливаю параметр redirect_uri URL-адреса приглашения на https://jwt.ms, и мое ожидание рабочего процесса:
- Нажатие на URL-адрес приглашения приводит меня к b2clogin
- Azure B2 C проверяет токен подсказки идентификатора
- Я попадаю на страницу регистрации с предварительно заполненными значениями в подсказке токена идентификатора
- После После успешной регистрации я перенаправлен на https://jwt.ms
Однако мои ожидания не оправдались, и после нажатия на URL приглашения я сразу же получаю https://jwt.ms с токеном JWT, содержащим номер приглашения (более подробно ниже) и идентификатор объекта (под) одного из ранее созданных профилей в AD, плюс стандартные утверждения, такие как exp, aud, et c.
Я подозреваю, что в моем понимании есть пробел как функция приглашения рабочего процесса. На какие области кода / политики следует обратить внимание и изменить их, чтобы обеспечить успешную регистрацию приглашения?
Некоторые дополнительные сведения:
- Я включил номер приглашения в подсказку идентификатора токена. и НЕ электронная почта, поэтому ReadOnlyEmail заменяется InvitationNumber в рамках пользовательской политики.
- Я скопировал поля из моей обычной политики регистрации в политику приглашений, ожидая, что его пользователь должен иметь возможность подписываться с любыми электронными письмами, которые ему нравятся, если это подтверждено B2 C (отсюда и " False "удаляется из примера технического профиля для регистрации приглашения)
- Номер приглашения также задается как выходная заявка для моего приложения для его обработки после получения токена JWT из B2 C.
- Политика приглашений использует ту же базу политик, что и моя обычная регистрация / вход.
- В базе общих политик я добавил нового поставщика утверждений для проверки подсказки токена идентификатора рядом с моим обычным JwtIssuer, который ссылается на сертификат подписи, который мое приложение использует для подписи подсказки токена идентификатора и использует его в последнем шаг пользователя SignUpInvitation. Я не уверен, что это правильно, но как только я использую JwtIssuer, я получаю ошибку в B2 C, что он не может проверить подпись подсказки токена ID.
- Технический профиль для регистрации и вызывается из путешествия пользователя:
<TechnicalProfile Id="LocalAccountSignUpWithInvitationToken">
<DisplayName>Email signup</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="IpAddressClaimReferenceId">IpAddress</Item>
<Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
<Item Key="language.button_continue">Create</Item>
</Metadata>
<InputClaimsTransformations>
<InputClaimsTransformation ReferenceId="CopyInvitationToken" />
</InputClaimsTransformations>
<InputClaims>
<InputClaim ClaimTypeReferenceId="extension_InvitationToken" />
<InputClaim ClaimTypeReferenceId="email" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectId" />
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
<OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
<OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
<OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
<OutputClaim ClaimTypeReferenceId="authenticationSource" />
<OutputClaim ClaimTypeReferenceId="newUser" />
<!-- Optional claims, to be collected from the user -->
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="surName" />
<OutputClaim ClaimTypeReferenceId="extension_InvitationToken" />
</OutputClaims>
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail" />
</ValidationTechnicalProfiles>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>
7. Путешествие пользователя:
<UserJourneys>
<UserJourney Id="SignUpInvitation">
<OrchestrationSteps>
<!--Read the input claims from the id_token_hint-->
<OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />
<!-- Check if user tries to run the policy without invitation -->
<OrchestrationStep Order="2" Type="ClaimsExchange">
<Preconditions>
<Precondition Type="ClaimsExist" ExecuteActionsIf="true">
<Value>extension_InvitationToken</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
<ClaimsExchanges>
<ClaimsExchange Id="SelfAsserted-Unsolicited" TechnicalProfileReferenceId="SelfAsserted-Unsolicited"/>
</ClaimsExchanges>
</OrchestrationStep>
<!-- Self-asserted sign-up page -->
<OrchestrationStep Order="3" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="LocalAccountSignUpWithInvitationToken" TechnicalProfileReferenceId="LocalAccountSignUpWithInvitationToken"/>
</ClaimsExchanges>
</OrchestrationStep>
<!-- Issue an access token-->
<OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIdTokenHintValidator"/>
</OrchestrationSteps>
<ClientDefinition ReferenceId="DefaultWeb"/>
</UserJourney>
</UserJourneys>