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

DI.*_*vaw 6 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页面,但未预先填充邀请代码.

Chr*_*ett 9

邀请流的工作样本在这里.

在WingTipGamesWebApplication项目中,InvitationController控制器类有两个动作方法,Create和Redeem.

该Create操作方法发送一个签名赎回链接的电子邮件地址的邀请的用户.此兑换链接包含此电子邮件地址.它还可以包含邀请代码.

该Redeem操作方法处理赎回链接.它通过电子邮件地址,作为JWT中的verified_email声明,该声明使用Wingtip Games应用程序的客户端密钥(请参阅项目CreateSelfIssuedToken中的Startup类中的方法WingTipGamesWebApplication),从兑换链接到邀请策略进行签名.它也可以传递邀请码.

将邀请政策可以在这里找到这里.

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

<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>
Run Code Online (Sandbox Code Playgroud)

所述extension_verifiedEmail权利要求类型,它被声明为只读字段(以便它无法由最终用户修改),被映射到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>
Run Code Online (Sandbox Code Playgroud)

将邀请用户旅途中可以找到这里.

邀请用户旅程的第二个编排步骤执行LocalAccount-Registration-VerifiedEmail技术配置文件:

<UserJourney Id="Invitation">
  <OrchestrationSteps>
    ...
    <OrchestrationStep Order="2" Type="ClaimsExchange">
      <ClaimsExchanges>
        ...
        <ClaimsExchange Id="LocalAccountRegistrationExchange" TechnicalProfileReferenceId="LocalAccount-Registration-VerifiedEmail" />
      </ClaimsExchanges>
    </OrchestrationStep>
  </OrchestrationSteps>
</UserJourney>
Run Code Online (Sandbox Code Playgroud)

该LocalAccount登记-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>
Run Code Online (Sandbox Code Playgroud)

本地帐户是由注册前AzureActiveDirectoryStore-WriteUserByEmail-ThrowIfExists验证技术简介中,CreateEmailFromVerifiedEmail声称转型复制verified_email要求的电子邮件要求:

<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>
Run Code Online (Sandbox Code Playgroud)

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

  • 将"extension_InvitationCode"声明添加到声明架构
  • 将其添加为邀请政策的输入声明
  • 将其作为输入声明添加到LocalAccount-Registration-VerifiedEmail技术配置文件中
  • 添加它作为一个持久要求的AzureActiveDirectoryStore-WriteUserByEmail-ThrowIfExist技术简介