AD B2C - 重新获取令牌后缺少自定义声明

Posted

技术标签:

【中文标题】AD B2C - 重新获取令牌后缺少自定义声明【英文标题】:AD B2C - Missing custom claims after re-acquiring token 【发布时间】:2021-04-27 10:56:31 【问题描述】:

我有一个使用 Azure AD B2C 管理身份验证的 ASP.NET Core 3.1 项目。我添加了一个名为 extension_userType 的自定义声明(即扩展属性)。

为此,我将其添加到我的 B2C_1A_signup_signin 自定义策略中作为输出声明:

 <DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<TechnicalProfile Id="PolicyProfile">
  <DisplayName>PolicyProfile</DisplayName>
  <Protocol Name="OpenIdConnect" />
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="passwordPolicies" DefaultValue="DisablePasswordExpiration, DisableStrongPassword" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="displayName" />
    <OutputClaim ClaimTypeReferenceId="givenName" />
    <OutputClaim ClaimTypeReferenceId="surname" />
    <OutputClaim ClaimTypeReferenceId="email" />
    <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
    <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
    <OutputClaim ClaimTypeReferenceId="identityProvider" />
    <OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="Policy:TenantObjectId" />
    <OutputClaim ClaimTypeReferenceId="extension_userType" />
  </OutputClaims>
  <SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>

此外,我还将它添加到“本地帐户登录”ClaimsProvider 下的B2C_1A_TrustFrameworkExtensions 策略中:

 <DisplayName>Local Account Sign In</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="login-NonInteractive">
      <Metadata>
        <Item Key="client_id">OMISSIS</Item>
        <Item Key="IdTokenAudience">OMISSIS</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="OMISSIS" />
        <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="OMISSIS" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="extension_userType" />
      </OutputClaims>
    </TechnicalProfile>
    <TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="extension_userType" />
      </OutputClaims>

用户登录后,extension_userType 声明可用:

但如果我重新启动网络应用程序,并且签名用户必须重新获取令牌(例如,当使用 AuthorizeForScopesAttribute 调用方法时),新令牌将不包含 extension_userType 声明。

相反,如果用户执行注销>登录,则声明将重新出现。

我分析了重新获取令牌时执行的快速重定向到AD B2C:它正确指向B2C_1A_signup_signin,所以我不明白为什么令牌不完整。

如果我可以为您提供更多信息以帮助您了解问题,请告诉我。在此先感谢:)

【问题讨论】:

【参考方案1】:

好的,我找到了原因:我忘记将相关的输出声明放到 AAD-UserReadUsingEmailAddressAAD-UserReadUsingObjectId 技术配置文件中:

        <TechnicalProfile Id="AAD-UserReadUsingEmailAddress">
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="extension_userType" />
          </OutputClaims>
        </TechnicalProfile>
        <TechnicalProfile Id="AAD-UserReadUsingObjectId">
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="extension_userType" />
          </OutputClaims>
        </TechnicalProfile>

【讨论】:

以上是关于AD B2C - 重新获取令牌后缺少自定义声明的主要内容,如果未能解决你的问题,请参考以下文章

B2C ID 令牌中缺少电话号码声明

AD B2C 自定义策略自定义声明出现错误“无法验证提供的信息”。注册时

如何使用 api 连接器和 asp net core web api 通过自定义声明丰富 azure b2c 令牌

从不记名令牌(Web API)获取自定义声明值

向 ID 令牌 OpenID 添加自定义声明

在 jwt-auth laravel 中获取自定义声明