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

AD B2C - Missing custom claims after re-acquiring token

我有一个 ASP.NET Core 3.1 项目使用 Azure AD B2C 来管理身份验证。我添加了一个名为 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,所以我不明白为什么令牌不完整。

如果我可以为您提供更多信息以帮助您理解问题,请告诉我。提前致谢:)

好的,我找到原因了:我忘记将相关输出声明放入 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>