B2C SAML 缺失声明

Bra*_*ady 4 saml-2.0 azure-ad-b2c

我正在尝试使用 B2C 自定义策略将 B2C 配置为我的 SAML Idp。作为测试,我已将本地 ADFS 环境设置为 SAML RP,这似乎是 B2C 登录页面正常工作所必需的(B2C SAML 不支持 Idp 发起的会话)。

我一直在遵循https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-get-started-customhttps://github.com/上的指南Azure-Samples/active-directory-b2c-advanced-policies/blob/master/Walkthroughs/RP-SAML.md用于设置我的 B2C 环境。

我尽可能显示最终用户收到的 B2C 登录页面,但是在我将帐户的凭据输入 B2C 登录页面后,我会使用 SAML 令牌重定向回我的 RP,但它不会解析任何配置的声明。SAML 令牌显示以下错误:

<samlp:Status> 
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder" />
     <samlp:StatusMessage>Id:410906d7-639d-4828-b28d-22f84dfa617b ; Message: Policy &apos;B2C_1A_signup_signin_saml' in tenant ' mytenant.onmicrosoft.com'' specifies the claim 'sub' for the SubjectNamingInfo, but the claim is either not present or is null.</samlp:StatusMessage> 
<IsPolicySpecificError>true</IsPolicySpecificError> 
</samlp:Status>
Run Code Online (Sandbox Code Playgroud)

我的 SignUpOrSigninSaml.xml RP 配置如下:

<RelyingParty>
  <DefaultUserJourney ReferenceId="SignUpOrSignInSaml"/>
    <TechnicalProfile Id="PolicyProfile">
      <DisplayName>PolicyProfile</DisplayName>
      <Protocol Name="SAML2" />
        <Metadata>
          <Item Key="PartnerEntity">https://adfs-test.mycorporation.com.au/FederationMetadata/2007-06/FederationMetadata.xml</Item>
          <Item Key="KeyEncryptionMethod">Rsa15</Item>
          <Item Key="DataEncryptionMethod">Aes256</Item>
          <Item Key="XmlSignatureAlgorithm">Sha256</Item>
        </Metadata>

    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="displayName" />
      <OutputClaim ClaimTypeReferenceId="givenName" />
      <OutputClaim ClaimTypeReferenceId="surname" />
    </OutputClaims>
    <!-- The ClaimType in the SubjectNamingInfo element below is a reference to the name of the claim added to the claims bag used by the token minting process.
    This name is determined in the following order. If no PartnerClaimType is specified on the output claim above, then the DefaultPartnerClaimType for the protocol specified in the claims schema if one exists is used, otherwise the ClaimTypeReferenceId in the output claim is used.

    For the SubjectNamingInfo below we use the DefaultPartnerClaimType of http://schemas.microsoft.com/identity/claims/objectidentifier, since the output claim does not specify a PartnerClaimType. -->
    <!-- <SubjectNamingInfo ClaimType="http://schemas.microsoft.com/identity/claims/objectidentifier" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" ExcludeAsClaim="true"/> -->
    <SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
Run Code Online (Sandbox Code Playgroud)

我尝试了“SubjectNamingInfo”的几种不同配置,例如:

<SubjectNamingInfo ClaimType="http://schemas.microsoft.com/identity/claims/objectidentifier" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" ExcludeAsClaim="true"/>

<SubjectNamingInfo ClaimType="sub" />

<SubjectNamingInfo ClaimType="name" />
Run Code Online (Sandbox Code Playgroud)

但它们都会产生相同的错误。

我相信,一旦对SubjectNamingInfo问题进行排序,配置的OutputClaims就会显示。

有人知道我该如何解决这个问题,以便我能够在令牌中看到我的用户帐户的声明吗?

- -编辑 - -

我尝试添加“sub”作为输出声明,但由于它未在基本文件中定义,B2C 不允许这样做。或者,我尝试将主题命名信息更改为已定义为输出声明的声明

<SubjectNamingInfo ClaimType="givenName" />
Run Code Online (Sandbox Code Playgroud)

但是我似乎仍然遇到同样的错误:

<samlp:Status> 
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder" /> 
<samlp:StatusMessage>Id:a3fe7ab0-4483-45b6-93f8-e75b539a3aea ; Message: The relying party technical profile of policy &apos;mytenant.onmicrosoft.com' in tenant 'B2C_1A_signup_signin_saml' specifies the claim type 'givenName' as the subject naming info claim, but the claim is not present or is null.</samlp:StatusMessage> 
<IsPolicySpecificError>true</IsPolicySpecificError>
Run Code Online (Sandbox Code Playgroud)

Chr*_*ett 6

使用sub声明作为<saml:Subject><saml:NameID>SAML 断言的元素并不常见。

建议按如下方式使用objectId声明。

1) 确保objectId声明是与SAML2协议的合作伙伴声明一起声明的:

<ClaimType Id="objectId">
  <DisplayName>Object Identifier</DisplayName>
  <DataType>string</DataType>
  <DefaultPartnerClaimTypes>
    <Protocol Name="OAuth2" PartnerClaimType="oid" />
    <Protocol Name="OpenIdConnect" PartnerClaimType="oid" />
    <Protocol Name="SAML2" PartnerClaimType="http://schemas.microsoft.com/identity/claims/objectidentifier" />
  </DefaultPartnerClaimTypes>
</ClaimType>
Run Code Online (Sandbox Code Playgroud)

2) 将objectId声明添加到<OutputClaims />依赖方技术配置文件的集合中并设置SubjectNamingInfo元素:

<RelyingParty>
  <TechnicalProfile Id="PolicyProfile">
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="objectId" />
      <OutputClaim ClaimTypeReferenceId="displayName" />
      <OutputClaim ClaimTypeReferenceId="givenName" />
      <OutputClaim ClaimTypeReferenceId="surname" />
    </OutputClaims>
    <SubjectNamingInfo ClaimType="http://schemas.microsoft.com/identity/claims/objectidentifier" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" ExcludeAsClaim="true"/>
  </TechnicalProfile>
</RelyingParty>
Run Code Online (Sandbox Code Playgroud)

有关主题命名信息的更多信息

subjectNamingInfo元素的 ClaimType 属性引用必须声明为技术配置文件的输出声明声明类型。

此声明类型按名称引用,优先级如下:

1) 如果指定了OutputClaim元素的PartnerClaimType属性,则SubjectNamingInfo元素的ClaimType属性必须设置为此OutputClaim元素的ClaimTypeReferenceId属性:

<RelyingParty>
  <TechnicalProfile Id="PolicyProfile">
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="http://schemas.microsoft.com/identity/claims/objectidentifier" />
      ...
    </OutputClaims>
    <SubjectNamingInfo ClaimType="objectId" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" ExcludeAsClaim="true"/>
  </TechnicalProfile>
</RelyingParty>
Run Code Online (Sandbox Code Playgroud)

2) 如果未指定OutputClaim元素的PartnerClaimType属性,则SubjectNamingInfo元素的ClaimType属性必须设置为此OutputClaim元素的ClaimTypeReferenceId属性引用的ClaimType元素的DefaultPartnerClaimType属性:

<ClaimType Id="objectId">
  <DefaultPartnerClaimTypes>
    <Protocol Name="SAML2" PartnerClaimType="http://schemas.microsoft.com/identity/claims/objectidentifier" />
  </DefaultPartnerClaimTypes>
</ClaimType>

<RelyingParty>
  <TechnicalProfile Id="PolicyProfile">
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="objectId" />
      ...
    </OutputClaims>
    <SubjectNamingInfo ClaimType="http://schemas.microsoft.com/identity/claims/objectidentifier" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" ExcludeAsClaim="true"/>
  </TechnicalProfile>
</RelyingParty>
Run Code Online (Sandbox Code Playgroud)