在 Azure B2C 的自定义策略中找不到声明 - Saml

Posted

技术标签:

【中文标题】在 Azure B2C 的自定义策略中找不到声明 - Saml【英文标题】:Claim not found in custom policy for Azure B2C - Saml 【发布时间】:2022-01-10 04:20:43 【问题描述】:

我已在我的 Azure AD B2C 中上传了从 SocialAndLocalAccounts 模板开始的自定义策略。 我已更改策略以使用 SAML 协议进行身份验证,如 MS Documentation 中所述

这是 TrustFrameworkExtensions.xml 文件中添加的声明提供程序

<ClaimsProvider>
  <DisplayName>Token Issuer</DisplayName>
  <TechnicalProfiles>

  <!-- SAML Token Issuer technical profile -->
  <TechnicalProfile Id="Saml2AssertionIssuer">
    <DisplayName>Token Issuer</DisplayName>
    <Protocol Name="SAML2"/>
    <OutputTokenFormat>SAML2</OutputTokenFormat>
    <Metadata>
      <Item Key="IssuerUri">http://localhost:8080/spring-security-saml2-sample</Item>
    </Metadata>
    <CryptographicKeys>
      <Key Id="SamlAssertionSigning" StorageReferenceId="B2C_1A_SamlIdpCert"/>
      <Key Id="SamlMessageSigning" StorageReferenceId="B2C_1A_SamlIdpCert"/>
      <Key Id="MetadataSigning" StorageReferenceId="B2C_1A_SamlIdpCert" />
    </CryptographicKeys>
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="subject" />
    </InputClaims>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="issuerUserId" />
      <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="first_name" />
      <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="last_name" />
      <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
      <OutputClaim ClaimTypeReferenceId="email"  />
      <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="myIDPName" />
      <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
    </OutputClaims>
    <OutputClaimsTransformations>
      <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
      <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
      <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
      <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
    </OutputClaimsTransformations>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Saml-issuer"/>
  </TechnicalProfile>

  <!-- Session management technical profile for SAML-based tokens -->
  <TechnicalProfile Id="SM-Saml-issuer">
    <DisplayName>Session Management Provider</DisplayName>
    <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.SamlSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </TechnicalProfile>

  </TechnicalProfiles>
</ClaimsProvider>

这是我的 B2C_1A_signup_signin_saml 政策中的 RelyingParty。

<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<TechnicalProfile Id="PolicyProfile">
  <DisplayName>PolicyProfile</DisplayName>
  <Protocol Name="SAML2"/>
  <Metadata>
    <Item Key="PartnerEntity">https://mydomainurl.url/spring_saml_metadata.xml</Item>
  </Metadata> 
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="displayName" />
    <OutputClaim ClaimTypeReferenceId="givenName" />
    <OutputClaim ClaimTypeReferenceId="surname" />
    <OutputClaim ClaimTypeReferenceId="email"/>
    <OutputClaim ClaimTypeReferenceId="identityProvider"/>
    <OutputClaim ClaimTypeReferenceId="objectId"/>
    <OutputClaim ClaimTypeReferenceId="issuerUserId"/>
  </OutputClaims>
  <SubjectNamingInfo ClaimType="objectId" ExcludeAsClaim="true"/>
</TechnicalProfile>

当我尝试使用用于测试的spring-saml application 登录时,我遇到了这个错误:

Caused by: org.opensaml.common.SAMLException: Response has invalid status code urn:oasis:names:tc:SAML:2.0:status:Responder, status message is Id:d5cae994-9df6-44a2-9044-ed1c108152dc ;消息:未找到 ID 为“issuerUserId”的声明,这是租户“supplauthtestcom.onmicrosoft.com”的策略“B2C_1A_signup_signin_saml”中 ID 为“CreateAlternativeSecurityId”的 ClaimsTransformation“CreateAlternativeSecurityId”所必需的。 在 org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:113) 在 org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:82) ... 31 更多

我认为问题出在 issuerUserId 映射上,但是当我添加设置时,没有任何改变。

关于如何解决此错误的任何建议?

【问题讨论】:

看起来很混乱,文档是向 B2C 添加 SAML IdP,但您正在尝试将 B2C 连接到 SAML 应用程序。正确的文档是here。 是的,我也关注了您链接的文档,但我无法解决我的问题 问题是你已经同时关注了这两者并且把它们混为一谈了。回到起始包并按照我链接的文档进行操作。 【参考方案1】:

经过几次尝试,我发现解决方案是自定义策略用于连接到外部 IDP 以获取身份验证的另一个 ClaimProvider 配置的错误配置。将 issuerUserId 映射更改为该 ClaimProvider 后,我的应用开始正常工作。

我认为问题在于 Saml2AssertionIssuer 获得了错误的 issuerUserId 值

【讨论】:

【参考方案2】:

Saml2AssertionIssuer 技术配置文件更改为

    <TechnicalProfile Id="Saml2AssertionIssuer">
      <DisplayName>Token Issuer</DisplayName>
      <Protocol Name="SAML2"/>
      <OutputTokenFormat>SAML2</OutputTokenFormat>
      <Metadata>
        <Item Key="IssuerUri">http://localhost:8080/spring-security-saml2-sample</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="SamlAssertionSigning" StorageReferenceId="B2C_1A_SamlIdpCert"/>
        <Key Id="SamlMessageSigning" StorageReferenceId="B2C_1A_SamlIdpCert"/>
      </CryptographicKeys>
      <InputClaims/>
      <OutputClaims/>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Saml-issuer"/>
    </TechnicalProfile>

&lt;RelyingParty&gt; 部分删除此内容:

<OutputClaim ClaimTypeReferenceId="issuerUserId"/>

将此添加到 &lt;RelyingParty&gt; 部分之前(如果尚未存在):

<UserJourneys>
  <UserJourney Id="SignUpOrSignIn">
    <OrchestrationSteps>
      <OrchestrationStep Order="7" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="Saml2AssertionIssuer"/>
    </OrchestrationSteps>
  </UserJourney>
</UserJourneys>

【讨论】:

以上是关于在 Azure B2C 的自定义策略中找不到声明 - Saml的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure AD 中创建用户之前,是不是可以使用 Azure B2C 自定义策略验证来自社交身份提供商 (iDP) 的电子邮件声明?

Azure AD B2C - 我们可以使用电子邮件 ID 而不是 UPN 登录 - 仅限本地帐户自定义策略吗?

如何在 Azure B2C 租户中显示自定义的注册页面?

蔚蓝 B2C。使用 Azure 门户编辑自定义属性

Azure B2C - 无法从策略中的 JWT 客户端断言令牌读取“日期”声明

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