【问题标题】:How does Azure AD identify the Principal from a SSO AuthnRequest?Azure AD 如何从 SSO AuthnRequest 中识别委托人?
【发布时间】:2022-01-07 21:41:10
【问题描述】:

在 SSO 身份验证过程中,我无法理解 Principal 信息是如何在身份验证请求中发送到 IDP(例如 Azure AD)的。

我检查了此 Azure AD 文章中显示的 AuthnRequest 示例,但它不包含有关需要进行身份验证的用户的任何信息:

https://docs.microsoft.com/en-us/azure/active-directory/develop/single-sign-on-saml-protocol

如果身份验证请求中未包含用户信息,谁能向我解释在这种情况下 IDP 将如何识别用户?

【问题讨论】:

    标签: azure single-sign-on saml


    【解决方案1】:

    AuthnRequest 是浏览器重定向到 Azure IdP。 Azure IdP 也不知道用户是谁。因此,它会在浏览器中显示 Azure 登录屏幕。然后用户登录到 Azure(现在 Azure 知道用户是谁),Azure IdP 将浏览器重定向到 SP 的 AssertionConsumerService (ACS) URL,其中 SAML AuthnResponse 来自 IdP 识别用户。

    下次用户的浏览器通过AuthnRequest 重定向到 Azure IdP 时,Azure 会查看 cookie 并知道用户已经通过身份验证,并立即使用 SAML AuthnResponse 将浏览器重定向回 ACS。

    如果 IdP 已同意向该 SP 发布有关用户的个人识别信息,则 AuthnResponse 中的 AttributeStatement 会识别用户。

    当然,如果用户在 Azure 中没有帐户,他们将无法登录。 Azure 会从他们的登录信息中知道他们是谁,这通常是他们的 userPrincipalName,看起来像 username@example.com

    正如评论所暗示的,用户名可以在AuthnRequest 中,但这并不经常使用。 SP 不应询问用户名,因为用户名“属于”用户(尽管最终它“属于”IdP),并且 IdP 可能不愿意将该信息发布给 SP。如果SP不需要知道用户是谁,只要他们有权访问服务,那么用户名就无关紧要了。通常根据AttributeStatement 中设置的Attribute 授予权限,这可以在SP 不需要知道用户的用户名的情况下完成。

    如果 SP 支持个性化,例如用户的偏好,不知道用户名不是问题。 SAML 属性(例如 eduPersonTargetedID)可以由 IdP 释放,该属性对于 IdP/SP 的组合具有相同的值(以停止跨服务跟踪),并且 SP 可以使用它来存储用户的首选项,而无需知道用户名。

    使用 SAML 的一种常见方式是用 SAML 流程替换用户名/密码登录屏幕:

    • 用户转到https://app.com
    • app 发现用户未通过身份验证(没有 cookie、会话或其他)。这是非 SAML 应用显示登录屏幕的时候。
    • 应用程序将用户重定向到他们的 IdP。在单个 IdP 的情况下很容易。应用不使用 AuthnRequest 中的主题。
    • 用户的 IdP 显示 IdP 的登录屏幕。
    • 用户在 IdP 进行身份验证
    • IdP 将浏览器重定向到应用的 ACS URL。
    • 应用检查 SAMLResponse,查看属性集并决定用户(仍然可能是匿名用户)是否可以获得访问权限。
    • 如果,例如用户有一个属性“eduPersonEntitlement”,其值为“http://app.com/entitled”,然后应用为该用户创建一个会话并将他们“登录”到应用。
    • 当用户在应用程序上的会话到期时,应用程序会将他们发送回其 IdP 以查看他们是否仍然有权访问该应用程序。

    【讨论】:

    • ACS = 断言 消费者服务,而不是属性。此外,SP 绝对可以收集用户名(如果您有一个与 IdP 有大量连接的大型实现,则有助于确定将用户重定向到哪里),并将该用户名与 AuthnRequest 一起发送到 <Subject> 元素中.参考this Answer。其他系统(如 Azure)将用户名连同 AuthnRequest 作为查询参数发送。
    • ACS,抱歉,打字太快了!我已经更新了关于 AuthnRequest 中主题的答案
    • @AndrewK。这正是我想象的应该如何工作。令我困惑的是,规范说 Subject 元素不是强制性的,甚至不推荐。
    • @codebrane 在我的例子中,应用程序从不显示 Azure 登录屏幕。用户只需在浏览器中输入应用程序的 URL,按回车键即可进入,它会默默地验证用户身份,而不提示输入用户名或密码。不确定我是否在这里遗漏了什么......
    • 如何在没有用户名或密码的情况下进行身份验证?我已经编辑了答案以显示 SAML 通常如何用于“登录”
    【解决方案2】:

    在 Azure 广告门户中,通过企业应用刀片注册应用后,我们为应用分配用户和组。

    • 我们可以在我们提供的配置设置上执行单点登录 重定向url,上传saml证书。
    • SAML 令牌包含有关用户的信息,称为声明。一个 声明是身份提供者声明的关于用户的信息 在他们为该用户颁发的令牌内。在 SAML 令牌中,此数据 在\SAML 属性声明中提出。
    • 默认情况下,Microsoft 身份平台向 您的应用包含 NameIdentifier 声明,其值为 Azure AD 中的用户名(用户主体名称),可以唯一 识别用户。 SAML 令牌还可以包含其他声明 比如用户的电子邮件地址、名字和姓氏,可以是 在部分 Attributes and Claims 中配置,它们包含在 令牌。我们可以根据需要的声明编辑此部分 关于用户主体的应用程序。

    参考资料:

    1. SAML 2.0 token claims reference | Microsoft Docs
    2. azure active-directory-saml-claims-customization(github.com)
    3. sample reference:SAML_Token_Configuration

    【讨论】:

    • 这不是 OP 要求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多