AADB2C自定义策略:声明的数据类型与策略中指定的ClaimType的数据类型不匹配

时间:2019-06-07 07:47:35

标签: azure-ad-b2c

我一直在AADB2C上创建邀请策略,根据Azure提供的WingTipGames示例,该策略由JWT保护。

我的示例稍有不同,因为我使用的是Azure函数而不是.NET应用程序。

我已在我的自定义策略上启用了Application Insights,以获取有关登录后为何失败的更多信息。我已成功重定向到我的社交登录名,但是登录后看起来好像用户创建方面存在问题。我收到此错误:

The data type 'Boolean' of the claim with id 'verified_email' does not match the DataType 'String' of ClaimType with id 'extension_VerifiedEmail' specified in the policy.

这是我的RelyingParty的摘录

<TechnicalProfile Id="Invitation">
  <DisplayName>Invitation</DisplayName>
  <Protocol Name="OpenIdConnect" />
  <InputTokenFormat>JWT</InputTokenFormat>
  <CryptographicKeys>
    <Key Id="client_secret" StorageReferenceId="B2C_1A_ClientSecret" />
  </CryptographicKeys>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_VerifiedEmail" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="displayName" />
    <OutputClaim ClaimTypeReferenceId="email" />
    <OutputClaim ClaimTypeReferenceId="identityProvider" />
    <OutputClaim ClaimTypeReferenceId="newUser" />
    <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
  </OutputClaims>
  <SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>

这是我的ClaimTypeTrustFrameworkBase.xml中的样子

<ClaimType Id="extension_VerifiedEmail">
  <DisplayName>Verified Email</DisplayName>
  <DataType>string</DataType>
  <DefaultPartnerClaimTypes>
    <Protocol Name="OAuth2" PartnerClaimType="verified_email" />
    <Protocol Name="OpenIdConnect" PartnerClaimType="verified_email" />
  </DefaultPartnerClaimTypes>
  <UserInputType>Readonly</UserInputType>
</ClaimType>

这是我的Google ClaimsProviderTrustFrameworkBase.xml的另一段代码

<InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="CreateEmailFromVerifiedEmail" />
  </InputClaimsTransformations>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_VerifiedEmail" />
  </InputClaims>
<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="extension_VerifiedEmail" Required="true" />
...
</OutputClaims>

这是上面代码中提到的ClaimsTransformation

<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>

最后,这是我正在构建传递到自定义策略的JWT的摘录。

var verifiedEmailClaim = new Claim("verified_email", email);
instancePolicyClaims.Add(verifiedEmailClaim);

我已手动解码了JWT,并且可以验证名为verified_email的JWT中是否存在该声明,并且该值正确。我不确定上面提到的错误消息是怎么回事或Boolean从哪里来。

1 个答案:

答案 0 :(得分:0)

这是由我的Google ClaimsProvider上的一些<InputClaims><OutputClaims>引起的。

我按照WingTipGames的规范添加了它们,但是它们包含在git repo中的文档仅适用于本地帐户。

我删除了以下几行,现在可以使用了。

</CryptographicKeys>
<!-- <InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="CreateEmailFromVerifiedEmail" />
  </InputClaimsTransformations>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_VerifiedEmail" />
  </InputClaims> -->
<OutputClaims>
  <!-- <OutputClaim ClaimTypeReferenceId="extension_VerifiedEmail" Required="true" /> -->
</OutputClaims>