这个 SAML SSO 实现是否正确?

3
我有一个网站,假设为www.e1.com。 www.e1.com是服务提供商。每当我在其中一个服务上单击时,我会被重定向到身份提供者,比如www.e2.com。在此之前,在服务提供商(www.e1.com)中,我将检查是否为用户设置了任何cookie。第一次没有cookie,因此它将发送空的SessionId值。因此,我将发送一个SAML请求到www.e2.com,同时没有id(因为没有设置cookie。Cookie包含Id)。
现在在www.e2.com即身份提供者中,我将检查www.e1.com是否已发送任何Id值。如果为空,我将创建一个会话ID并将其存储在数据库中(在www.e2.com中)。然后,我将重定向浏览器到我的身份验证页面,要求用户输入用户名和密码,并相应地进行身份验证。如果身份验证成功,我将使用包含会话ID的SAML响应将浏览器重定向到服务提供者(www.e1.com)。
现在,在服务提供者中,SessionId值将存储在Cookie中,并将浏览器重定向到消费者服务页面(用户想要访问的服务页面)。
现在,如果同一用户想要在同一服务提供商中访问其他服务(在会话期间),则浏览器显然会随请求SAML一起发送SessionId的Cookie。身份提供者将在其数据库中检查SessionId值,如果其数据库中存在,则会直接向用户提供服务访问权限,而无需输入登录凭据,因为用户已经在会话期间进行了身份验证。
这是使用SAML实现单点登录的正确方法吗?或者,如果此方法存在缺陷,您可以解释一下这些缺陷吗?
谢谢!
1个回答

15

你的理解还不够正确 :)

以下是流程:

  1. 用户尝试访问SP上的受保护资源。SP检查用户是否有本地(已经认证的)会话。如果没有,它将生成一个包含随机ID的SAML <AuthRequest>。然后,SP将重定向用户到IDP并带上这个AuthnRequest。

  2. IDP将检查用户是否有本地认证的会话。如果没有,它将对用户进行身份验证。IDP将使用与SP在其AuthnRequest中发送的ID匹配的inReplyTo属性向SP发送AuthResponse

  3. 然后,SP将创建一个本地会话。除非a)会话过期或b)SP收到来自IDP的SingleLogout消息,否则对SP的后续请求将不涉及IDP。


1
嗨,Ashwin,简短的回答是正确的。更长的答案是这取决于SAML绑定方式。在重定向绑定的情况下,用户的浏览器将被重定向回SP并携带AuthResponse。在POST绑定的情况下,用户的浏览器将向SP发出POST请求,并携带此AuthResponse。最后,在工件绑定的情况下,用户将被重定向到具有工件ID的SP。然后,SP将使用此工件ID查询IDP以获取AuthResponse。 - user404345
2
用户将看到一个包含隐藏字段的表单的HTML页面。该表单的操作被设置为指向SP。然后,用户通过单击按钮或更可能使用在onDomLoaded事件期间触发的一些JavaScript来提交此表单。在这种情况下,用户会POST回SP,尽管他可能没有意识到发生了这种情况。这实际上是最常见的IDP-> SP绑定,这是我们默认使用的绑定方式。 - user404345
1
没有,这没有任何问题,唯一的问题是你受到查询字符串的最大长度限制,这可能会阻止你传递详细的响应(例如包含SAML属性)。此外,还存在潜在的安全风险,因为SAML响应可能会被存储在服务器日志文件中。 - user404345
在第三点中,您提到了 除非 a) 会话过期或 b) SP 收到 SingleLogout 如果我手动清除浏览器历史记录,那么我该如何处理? - Hardik Pithva
@Hearty 如果您的浏览器Cookie被清除,从用户的角度来看,它就像是擦除了会话。但是(IdP或SP)服务器在会话超时之前还不知道这一点。如果您迫切需要支持此场景,则应用程序需要侦听cookiechangeevent并触发SLO URL。 - asgs
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接