【问题标题】:How do I add a user attribute in a SAML SSO response如何在 SAML SSO 响应中添加用户属性
【发布时间】:2021-05-11 00:20:29
【问题描述】:

我正在使用 Azure AD B2C 作为自定义站点的身份提供程序,该站点还为 Blackboard Learn LMS 站点提供 SSO。 Blackboard 可以通过 SAML 进行 SSO,因此我在 B2C 中使用这些功能。不幸的是,SAML 不是我熟悉的协议,因此我的故障排除能力有限。我正在学习以下教程:

https://docs.microsoft.com/en-us/azure/active-directory-b2c/saml-service-provider?tabs=windows&pivots=b2c-custom-policy

一切进展顺利,但我正在尝试映射与 Blackboard 共享的用户属性,以便在创建新用户时,他们至少有一个基本配置文件。本教程中自然会出现一些属性,但我正在尝试为配置文件指定用户名(规范要求它是电子邮件地址),但我没有任何运气。

我在 SignUpOrSignIn 策略中添加了名为“userPrincipalName”的OutputClaim(请参见下面的代码),因为它具有来自 B2C 的适当值,但根据 Blackboard 测试页面,它不在正在生成的值中在 SAML 响应中发送(请参阅下面的屏幕截图)。

  ...
  <RelyingParty>
    <DefaultUserJourney ReferenceId="SignUpOrSignIn" />
    <TechnicalProfile Id="PolicyProfile">
      <DisplayName>PolicyProfile</DisplayName>
      <Protocol Name="SAML2"/>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="displayName" />
        <OutputClaim ClaimTypeReferenceId="givenName" />
        <OutputClaim ClaimTypeReferenceId="surname" />
        <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
        <OutputClaim ClaimTypeReferenceId="email" DefaultValue="" />
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="" />
        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="objectId"/>
      </OutputClaims>
      <SubjectNamingInfo ClaimType="objectId" ExcludeAsClaim="true"/>
    </TechnicalProfile>
  </RelyingParty>
  ...

是否需要采取进一步措施?我也在这里和那里修改了 TrustFrameworkExtensions(和 Base),但无济于事,而且我找不到任何描述的用于向 SAML 响应添加新属性的过程。有没有人有可以指导我完成的示例/教程?

(我查看了this question,答案表明我可能需要更改 NameIdFormat。我可以看到我的 B2C 应用程序元数据中的格式不正确,但我不确定我会怎么做关于改变它)

更新

根据@JasSuri-MSFT 的建议,我为 UPN 设置了一个(非空)默认值,果然,该默认值通过了。因此,问题似乎在于 UPN 为空。

这很奇怪,因为在 B2C 中用户的编辑页面中,显然有一个 UPN 值。它还突出了我没有提到的另一个奇怪之处。但是该政策中还列出了其他OutputClaims,它们也未包含在内。其中一个,email,我明确提供了一个值,它显然也显示为 null。

很明显,管道中有另一块我没有建立。

【问题讨论】:

  • 您在正确的位置进行更改,但如果 userPrincipalName 为空,您将不会在 SAML 响应中看到它。尝试向它添加一个 defaultValue。 B2C 用户的 UPN 通常也是无用的 (randomguid@yourtenant.com)。
  • @JasSuri-MSFT,谢谢。正如你所建议的,我尝试了一个 defaultValue,它确实通过了。因此,对于 SAML 响应,UPN 似乎为空。但是,在设置此用户时,我明确设置了该用户和电子邮件的值,因此 B2C 确实 具有它们的值。是否还需要通过 SAML 协议推送这些值?
  • 您需要在旅程中的某个时刻实际读取值。作为用户旅程的一部分执行的技术配置文件之一需要将声明 (UPN) 设置为输出声明。 UPN 通常来自没有协议的技术配置文件,表示来自目录的读/写操作。您通常不会为 B2C 用户设置 UPN 的值,它是为您生成的。电子邮件通常存储在身份集合中,在自定义策略中称为 signInNames.emailAddress。查看 AAD-UserReadUsingObjectId 技术简介。
  • Azure 门户始终将 UPN 显示为 B2C 用户身份集合中的登录名称之一。它实际上不是 UPN 属性,因此是我的第一条评论。
  • 您需要使用图形 api 检查用户并在自定义策略中使用正确的原始属性名称。

标签: azure-ad-b2c saml


【解决方案1】:

AAD-UserReadUsingObjectId 中添加signInNames.emailAddress 作为输出声明,并在RelyingParty 部分中添加signInNames.emailAddress 作为输出声明。在 RelyingParty 的输出声明中使用 partnerClaimType 以在 SAML 响应中发出您喜欢的名称的声明。

 <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email"/>

https://github.com/azure-ad-b2c/azureadb2ccommunity.io/wiki/LocalAccount-Sign-In-and-Sign-Up-policy

https://docs.microsoft.com/en-us/azure/active-directory-b2c/user-profile-attributes#identities-attribute

https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-technical-profile#outputclaims

【讨论】:

  • 谢谢!我希望今天晚些时候或明天会回到这个问题。我会根据我的发现进行更新。谢谢!
猜你喜欢
  • 2017-08-21
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
相关资源
最近更新 更多