Azure AD B2C在SignUp策略中预填充自定义属性

时间:2017-09-23 14:09:22

标签: azure-ad-b2c

从Web应用程序(ASP.Net MVC)调用时,Azure AD B2C是否支持在SignUp策略中预先填充自定义属性?

我们可以创建自定义SignUp属性,但是我们无法在文档中找到如何传递值来填充自定义属性的规范。如果不支持开箱即用,是否有人找到了解决方法?

如果有人遇到类似情况并找到了有用的解决方案,以下是上下文的更多细节:

我们探索了使用Azure AD B2C解决以下方案的选项:注册用户通过发送邀请电子邮件邀请其他人注册应用程序,该电子邮件具有应用程序登录页面的URL以及特殊的邀请代码(guid )作为查询参数,它可以单击链接并重定向到注册页面。受邀人员创建帐户后,我们需要使用该代码将新创建的用户与发送邀请的用户相关联。

目前,这是使用默认身份提供程序在ASP.Net中实现的(使用AspNet ...表存储用户数据在数据库中)。通过使用Azure AD B2C替换本地身份提供程序,我们将在Azure AD B2C注册页面的往返过程中丢失上下文。用户单击电子邮件上的链接并转到SIgnUp页面,但未预先填充邀请代码。

1 个答案:

答案 0 :(得分:7)

邀请流的工作样本为here

WingTipGamesWebApplication项目中,InvitationController控制器类有两种操作方法,CreateRedeem

Create操作方法将签名的兑换链接发送到受邀用户的电子邮件地址。此兑换链接包含此电子邮件地址。它还可以包含邀请码。

Redeem操作方法处理兑换链接。它传递了电子邮件地址,作为使用Wingtip Games应用程序的客户端密钥签名的JWT中的 verified_email 声明(请参阅CreateSelfIssuedTokenStartup中的WingTipGamesWebApplication方法<RelyingParty> <DefaultUserJourney ReferenceId="Invitation" /> <TechnicalProfile Id="Invitation"> <InputTokenFormat>JWT</InputTokenFormat> <CryptographicKeys> <Key Id="client_secret" StorageReferenceId="WingTipGamesClientSecret" /> </CryptographicKeys> <InputClaims> <InputClaim ClaimTypeReferenceId="extension_VerifiedEmail" /> </InputClaims> </TechnicalProfile> </RelyingParty> 项目),从兑换链接到邀请政策。它也可以传递邀请码。

可以在here找到邀请政策。

邀请政策将 verified_email 声明声明为输入声明:

<BuildingBlocks>
  <ClaimsSchema>
    <ClaimType Id="extension_VerifiedEmail">
      <DisplayName>Verified Email</DisplayName>
      <DataType>string</DataType>
      <DefaultPartnerClaimTypes>
        <Protocol Name="OAuth2" PartnerClaimType="verified_email" />
        <Protocol Name="OpenIdConnect" PartnerClaimType="verified_email" />
        <Protocol Name="SAML2" PartnerClaimType="http://schemas.wingtipb2c.net/identity/claims/verifiedemail" />
      </DefaultPartnerClaimTypes>
      <UserInputType>Readonly</UserInputType>
    </ClaimType>
  </ClaimsSchema>
</BuildingBlocks>

extension_verifiedEmail 声明类型(声明为只读字段(以便最终用户无法修改))映射到 verified_email < / strong>输入声明:

<UserJourney Id="Invitation">
  <OrchestrationSteps>
    ...
    <OrchestrationStep Order="2" Type="ClaimsExchange">
      <ClaimsExchanges>
        ...
        <ClaimsExchange Id="LocalAccountRegistrationExchange" TechnicalProfileReferenceId="LocalAccount-Registration-VerifiedEmail" />
      </ClaimsExchanges>
    </OrchestrationStep>
  </OrchestrationSteps>
</UserJourney>

邀请用户旅程可在here

中找到

邀请用户旅程的第二个编排步骤执行 LocalAccount-Registration-VerifiedEmail 技术资料:

<TechnicalProfile Id="LocalAccount-Registration-VerifiedEmail">
  <DisplayName>WingTip Account</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ContentDefinitionReferenceId">api.localaccount.registration</Item>
    <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
    <Item Key="language.button_continue">Create</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="issuer_secret" StorageReferenceId="TokenSigningKeyContainer" />
  </CryptographicKeys>
  <InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="CreateEmailFromVerifiedEmail" />
  </InputClaimsTransformations>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_VerifiedEmail" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="extension_VerifiedEmail" Required="true" />
    <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="displayName" Required="true" />
    <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="localAccountAuthentication" />
    <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
    <OutputClaim ClaimTypeReferenceId="newUser" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="sub" />
    <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AzureActiveDirectoryStore-WriteUserByEmail-ThrowIfExists" />
  </ValidationTechnicalProfiles>
  <UseTechnicalProfileForSessionManagement ReferenceId="SSOSession-AzureActiveDirectory" />
</TechnicalProfile>

LocalAccount-Registration-VerifiedEmail 技术配置文件使用经过验证的电子邮件地址注册本地帐户:

<ClaimsTransformation Id="CreateEmailFromVerifiedEmail" TransformationMethod="FormatStringClaim">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_VerifiedEmail" TransformationClaimType="inputClaim" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="stringFormat" DataType="string" Value="{0}" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>

AzureActiveDirectoryStore-WriteUserByEmail-ThrowIfExists 验证技术配置文件注册本地帐户之前, CreateEmailFromVerifiedEmail 声明转换会将 verified_email 声明复制到电子邮件声明:

<ion-slides pager>
    <ion-slide *ngFor="let blog of blogs | async" >
      <h2>{{ blog.title }}</h2>
      <p>
      <a target="_blank" class="slider-read-more" ion-button outline color="secondary" (click)="blogDetail(blog)">ვრცლად</a>
      </p>
    </ion-slide>
  </ion-slides>

要针对本地帐户保存邀请代码,您必须:

  • 添加&#34; extension_InvitationCode&#34;声称声明架构
  • 将其添加为邀请政策
  • 的输入声明
  • 将其作为输入声明添加到 LocalAccount-Registration-VerifiedEmail 技术资料
  • 将其作为持久声明添加到 AzureActiveDirectoryStore-WriteUserByEmail-ThrowIfExist 技术配置文件