如何在S2身份提供者的B2C技术资料中读取NameID元素作为声明?

时间:2018-10-05 17:23:46

标签: azure-ad-b2c

我遵循了Set up sign-in with a Salesforce SAML provider by using custom policies in Azure Active Directory B2C中的示例 并能够成功将SSO从Salesforce迁移到Azure B2C。但是,我也想检索 SAML声明中的NameID元素作为声明。这可能吗?

例如,假设发布到B2C的断言使用者终结点的传入SAML 2.0断言看起来 类似于这种简化的XML。

<saml:Assertion>
    <saml:Issuer>https://mytestinstance-dev-ed.my.salesforce.com</saml:Issuer>
    <saml:Subject>
        <saml:NameID>emp99999</saml:NameID>
    </saml:Subject>
    <saml:AuthnStatement AuthnInstant="2018-10-04T16:56:44.192Z">
        <saml:AuthnContext>
            <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef>
        </saml:AuthnContext>
    </saml:AuthnStatement>
    <saml:AttributeStatement>
        <saml:Attribute Name="userId">
            <saml:AttributeValue>009f90000099zzz</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="username">
            <saml:AttributeValue>user000@example.com</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="email">
            <saml:AttributeValue>user000@example.com</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="">
            <saml:AttributeValue>false</saml:AttributeValue>
        </saml:Attribute>
    </saml:AttributeStatement>
</saml:Assertion>

TechnicalProfile允许您通过引用AttributeStatement中的任何属性作为声明来访问它 OutputClaim元素中PartnerClaimType中的名称。例如,对于下面的TechnicalProfile,socialIdpUserId声明为 设置为SAML声明“ 009f90000099zzz”中的userId属性值。我想拥有的是 是一个名为employeeId的声明,该声明设置为“ emp99999”,即NameID元素的值。

<TechnicalProfile Id="salesforce">
    <DisplayName>Salesforce</DisplayName>
    <Description>Login with your Salesforce account</Description>
    <Protocol Name="SAML2"/>
    <Metadata>
        <Item Key="RequestsSigned">false</Item>
        <Item Key="WantsEncryptedAssertions">false</Item>
        <Item Key="WantsSignedAssertions">false</Item>
        <Item Key="PartnerEntity">https://mytestinstance-dev-ed.my.salesforce.com/.well-known/samlidp/TestB2C.xml</Item>
    </Metadata>
    <!-- <CryptographicKeys>  -->
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="userId"/>
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email"/>
        <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="username"/>
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication"/>
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="SAMLIdp" />
        <!-- We want the Subject/NameID value as a custom employeeId claim. URI reference doesn't work. -->
        <OutputClaim ClaimTypeReferenceId="employeeId" 
            PartnerClaimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" />
    </OutputClaims>
    <!--<OutputClaimsTransformations> -->
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop"/>
</TechnicalProfile>

我尝试使用PartnerClaimType值(例如“ NameID”,“ NameIdentifier”)以及NameIdentifier的知名URI 这些似乎都不起作用。

我还看到了一些使用SubjectNamingInfo元素的参考,并进行了实验, 但这似乎仅与定义发送到RelyingParty的令牌有关 而不是从IDP收到的令牌中读取声明。

另外,其他断言元素呢?例如,根据IDP的使用方式, 我可以看到需要读取AuthnContextClassRef值来决定是否 发出MFA挑战。

3 个答案:

答案 0 :(得分:4)

使用assertionSubjectName的解决方案绝对正确。实际上,MSFT于2018年12月20日更新了其主要文档页面,以添加更多信息:Define a SAML Technical Profile。话虽这么说-我想再增加一张纸条,以帮助遇到这种情况的其他人。如果NameID元素具有“ NameQualifier”属性,则Azure似乎不会将NameID映射到您的输出声明。

示例-这将映射到您的输出声明:

 <Subject>
            <NameID>foo@bar.com</NameID>

这不会映射到您的输出声明:

<Subject>
    <NameID NameQualifier="https://bar.com/realms/foo">foo@bar.com</NameID>

希望这对遇到“ assertionSubjectName”似乎不起作用的人有帮助。话虽这么说-似乎这种行为并不是所有人都想要的,我已经联系MSFT来确定这是否是WAD。

答案 1 :(得分:2)

对于SAML2协议,可以使用值为{strong>“ assertionSubjectName” 的PartnerClaimType访问NameID元素的值。 在“为SAML 2.0声明提供者指定技术资料”部分中提到了这一点。 Features part 6 在高级策略Git存储库中。

例如,要将NameID从SAML声明映射到“ employeeId”声明,请将其PartnerClaimType设置为“ assertionSubjectName” 在OutputClaim声明元素中。

<OutputClaims>
    <!-- Other claims -->
    <OutputClaim ClaimTypeReferenceId="employeeId" 
        PartnerClaimType="assertionSubjectName" />
</OutputClaims>

另一个示例可以在 Specifying a technical profile for a SAML 2 excerpt from documentation.docx

修改

根据Adam C的回答,现在记录在 Define a SAML technical profile in an Azure Active Directory B2C custom policy。他还指出,如果NameID元素具有“ NameQualifier”属性,则B2C不会将NameID映射到您的输出声明。

答案 2 :(得分:1)

就我而言,我试图从SAML响应中提取NameID,其中NameID元素具有SPNameQualifier属性。无法使用assertionSubjectName

但是,有效的方法是使用SPNameQualifier 属性值

例如,假设您的SAML响应看起来像

<saml:Subject>
  <saml:NameID SPNameQualifier="https://bar.com/realms/foo">emp99999</saml:NameID>
</saml:Subject>

要提取NameID值,可以将声明映射设置为

<OutputClaims>
  <!-- Other claims -->
  <OutputClaim ClaimTypeReferenceId="employeeId" PartnerClaimType="https://bar.com/realms/foo" />
</OutputClaims>