当前位置: 首页 > 知识库问答 >
问题:

AzureAD IDP发起的SAML总是返回nameid-form:持久而不是nameid-form:电子邮件地址

潘英豪
2023-03-14

我正在使用SAML开发SSO,我的IdP是Azure。

我对IDP启动的流量有问题。在SAML回复中,我总是得到以下名称ID:

<NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">
    bMFy2VsLxPyxxxxxx.....
</NameID>

这就是我所期待的:

<NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
    user-email-address@foo.bar
</NameID>

我总是得到nameid格式:persistent,而不是nameid格式:emailAddress。虽然我已将“名称标识符格式”设置为“电子邮件地址”:

请注意,在SP启动的流中,我可以通过指定NamedPolicy让Azure发送电子邮件地址:

<samlp:AuthnRequest
        Destination="xxx"
        ID="_f59f9e55bc165eae92e4269909e274aeb78f88f3" 
        IssueInstant="2020-03-04T10:49:51Z" Version="2.0"
        xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
        xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <saml:Issuer>xxxxxxx</saml:Issuer>
  <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"/>
</samlp:AuthnRequest>

但是,在IdP启动的流上,AuthnRequest没有NamedPolicy

<samlp:AuthnRequest xmlns="urn:oasis:names:tc:SAML:2.0:metadata" 
                    ID="F84D888AA3B44C1B844375A4E8210D9E" Version="2.0"
                    IssueInstant="2020-03-04T10:03:47.953Z" IsPassive="false"
                    AssertionConsumerServiceURL="xxxxxx"
                    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
                    ForceAuthn="false">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">xxxxxx</Issuer>
</samlp:AuthnRequest>

我想知道我的Azure应用程序配置是否有问题。

顺便说一句,关于IdP发起的流,我认为IdP将创建SAML响应,并直接发送到SP的ACSendpoint。为什么还有SAML请求?(在Azure上测试应用程序时,我可以看到下载SAML请求的选项)。当我从应用程序面板(office.com)打开应用程序时,我也可以看到SAML请求。(使用镀铬延长板saml镀铬面板)

共有2个答案

轩辕晔
2023-03-14

我在微软AzureAD开了一张支持票。我从微软工程师那里得到了这个答案:

我已经查看了您遇到的问题以及应用程序的设置。您正在将名称ID设置为邮件属性并使用电子邮件格式。如果我理解错了,请纠正我。

在这种情况下,如果用户在mail属性中没有值,那么Azure AD将发送名称ID的持久格式,并在其中设置随机值。

因此,请检查用户在其邮件属性中是否有值。

真的!我测试的用户没有电子邮件属性!据微软支持人员称,他说,从Azure门户,我们无法判断测试的租户成员是否有电子邮件:

他说我们可以使用PowerShell或Azure CLI进行测试:

$ Get-AzureADUser -ObjectId <Object ID of the user>
# or
$ az ad user show --id <Object ID of the user>
{
  ...
  "jobTitle": null,
  "lastDirSyncTime": null,
  "legalAgeGroupClassification": null,
  "mail": null,
  "mobile": null,
  "objectId": ....
}

测试的用户没有邮件属性。所以行为是意料之中的。

但我仍然想知道,在SP启动的流中,IdP返回了什么值。它看起来很像邮件值:用户电子邮件-address@foo.bar

事实证明,当邮件为空时,它将返回userPrincipalName属性。

如果我们希望租户成员存在属性邮件,该租户必须订阅邮件服务或捆绑包,如Office 365、Exchange Online等。在这种情况下,我们不订阅任何。我以为只要在Azure中创建一个用户,该用户就已经有了一封电子邮件!为了确保这一点,我选择了outlook。com并尝试登录。这就是我得到的:

云承弼
2023-03-14

尝试使用IdP启动流与NameID策略

<samlp:AuthnRequest
xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
ID="id6c1c178c166d486687be4aaf5e482730"
Version="2.0" IssueInstant="2013-03-18T03:28:54.1839884Z"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://www.contoso.com</Issuer>
<samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">
  </samlp:NameIDPolicy>
</samlp:AuthnRequest>

有关更多详细信息,请参阅本文(翻译成英文)。

 类似资料:
  • 我是单点登录 (SSO) 概念的新手。我开始知道 SAML 请求和响应是实现 SSO 过程的最佳方式。然后我开始阅读有关SAML2.0的内容。我在 saml2.0 中发现了一个术语 NameIdPolicy,这在 saml1.0 中是不存在的。 定义说这是我们从IdP请求的NameID的格式,我想知道该格式是什么?我的意思是来自IDP的哪些数据应该以NameIDPolicy指定的格式出现?任何人都

  • 我有一个使用Spring Security的应用程序。在成功注册后,我试图获取用户的姓名,但当我进入登录页面时,我收到的是电子邮件而不是姓名。成功登录后,我提供了一个屏幕截图。 在上图中,我想要名字,而不是电子邮件地址。 我在给你上课,我认为这最重要。 控制器类 安全配置类 LOGIN.HTML 应用程序用户类

  • 问题内容: 现在,我已经建立了一个PHP电子邮件表单,并且一切正常。但是,在测试时,我只得到了发件人的电子邮件地址作为名称。我想要的是发件人的姓名,例如: 约翰·杜 科目科目科目 代替: j.doe@website.com 科目科目科目 下面是代码… 有谁可以帮助我吗?谢谢。 PHP: 问题答案: 在您的4行说完之后添加一行:

  • 我试图让2支球队互相比赛。当我说团队1.玩(团队2)时,我称之为;当 i 生成的数字小于 0.5 时,team2 应获胜,如果大于 0.5,则团队 1 应获胜。当团队 1 获胜时,它会正确显示为尼克斯,但当团队 2 获胜时,它会显示内存地址。我怎么能让它正确地说网是赢的,而不是team@78987neu73

  • 我使用的是Spring Boot v2。3.3. 我试图通过使用在v5.2中添加到Spring的saml支持来添加SSO支持:(https://docs.spring.io/spring-security/site/docs/5.2.1.RELEASE/reference/htmlsingle/#saml2) 我对Spring和SAML相当陌生,虽然该参考页面提到当前功能集“支持加密的NameId

  • 问题内容: 我正在尝试创建一个php脚本,该脚本将使用mySQL数据库为我处理邮件列表,而我已将其中的大部分安装到位。不幸的是,我似乎无法使标题正常工作,并且我不确定问题出在哪里。 我在接收端得到的结果是: “noreply”@rilburskryler.net rn回复至:noreply@rilburskryler.netrnX-Mailer:PHP / 5.2.13rnMIME版本:1.0 问