我有一个网站说 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值。如果为null,我将创建会话ID并将其存储在数据库中(在www.e2.com中)。然后我将浏览器重定向到我的身份验证页面,其中将询问用户的姓名和密码,因此他将进行身份验证。如果身份验证成功,我将使用包含会话ID的SAML响应将浏览器重定向到服务提供商(www.e1.com)。
现在在服务提供商中,SessionId值将存储在Cookie中,浏览器将重定向到消费者服务页面(用户想要访问的服务页面)。
< / p>
现在,如果同一用户想要从同一服务提供商访问某些其他服务
(在会话中),浏览器显然会在Cookie中发送SessionId以及请求SAML。身份提供者将检查其数据库中的SessionId值,如果它在其数据库中,那么它将直接访问用户的服务而不输入登录凭证,因为用户已经为会话进行了身份验证。
< / p>
这是使用SAML实现单点登录的正确方法吗?或
如果这种方法有缺陷,你能解释一下这些缺陷吗?
提前致谢:)
答案 0 :(得分:15)
你的理解不太正确:)
以下是流程:
用户尝试访问SP上的受保护资源。 SP检查是否
用户具有本地(和经过身份验证的会话)。如果没有它会产生一个
SAML <AuthRequest>
,其中包含随机ID。然后SP重定向
使用此AuthnRequest的用户到IDP。
IDP将检查用户是否具有本地经过身份验证的会话。如果
不会对用户进行身份验证IDP会发送AuthResponse
返回SP,其inReplyTo
属性与发送的id匹配
其中的SP是AuthnRequest
然后,SP将创建一个本地会话。随后的请求
除非a)会话到期或b)SP,否则SP不会涉及IDP
从IDP收到SingleLogout
条消息