我遵循了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挑战。
答案 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>