如何在没有sso服务器的情况下实现基于cookie的单点登录? 我想分享使用多个应用程序登录的用户 只有浏览器上的cookie。
在我看来,它的工作方式如下:
在此解决方案中,用户可能会看到(另一个用户的)浏览器cookie 并采用用户名编码的字符串。然后他可以添加它 一个自己的饼干(不好!)。
有一些安全的方法可以做到这一点吗?使用基于时间戳的控件或 这样的事情?
提前致谢。
再见
P.S。 我知道我的英语不是很好......对不起!
答案 0 :(得分:14)
这是不可能的。 Cookie是每个域唯一的,一个域无法读取其他域的Cookie。
答案 1 :(得分:8)
有一个简单的解决方案,不使用sso服务器,但没有使用1个常见的cookie,因为我们知道域之间不共享cookie。
当用户在site-a.com上进行身份验证时,您在site-a.com域上设置了一个cookie。然后在site-b.com上,链接来自site-a.com的动态javascript,由有权访问创建的cookie的服务器端脚本(php等)生成,然后在site-b.com上复制相同的cookie在客户端使用js。现在两个站点都有相同的cookie,无需要求用户重新登录。
您可以使用site-a和site-b都知道如何解码的方法对cookie值进行加密/编码,以便site-b能够验证他的cookie副本。使用一个共同的秘密,没有它就不可能编码或解码。
您看到在site-b.com的第一页加载时,cookie不存在,因此如果您认为有必要,您可能希望在设置cookie后重新加载页面。
答案 2 :(得分:4)
我认为答案有点晚,但也许我可以帮助别人。
您可以在使用iframe连接到主页的中间域中拥有cookie / localStorage
1)登录 您的任何域中的登录表单都会通过事件将标识令牌存放在sso.domain.com上的cookie中(postMessage) 2)验证 domain1和domain2包含一个指向sso.domain.com的iframe,该iframe读取令牌并通知主页
为简化开发,我们最近在https://github.com/Aralink/ssojwt
发布了JWT的跨域SSO答案 3 :(得分:3)
我做了类似的事情。有一个PHP应用程序,用户登录,系统联系Web服务,然后服务检查用户在Active Directory上的凭据。用户通过身份验证后,其PHP会话将存储在数据库中。另一个Web应用程序可以从cookie中读取PHP会话,并在PHP应用程序中使用一个Web服务,PHP应用程序检查数据库中的会话并返回用户ID。通过这种方式,我有一个使用SOA的SSO。
不要依赖存储在浏览器中的用户ID,是安全错误,至少要加密id。
最好的解决方案是将登录表单和会话存储放在同一个应用程序中,然后该应用程序可以为其他应用程序提供服务。
并使用HTTPS进行信息交换。
只有当属于同一个域时才能读取cookie,例如:
intranet.example.com crm.example.com example.com/erp
答案 4 :(得分:2)
您可以跨子域访问Cookie,但我认为使用浏览器Cookie不是一个很好的解决方案。您实际上不需要“SSO服务器”来实现单点登录。很容易想出两个应用程序都能识别的有效负载。我见过使用XML通过HTTPS传输有效负载的自定义SSO解决方案。
答案 5 :(得分:0)
这是一个解决方案(希望安全专家能够在这里仔细审查):
让每个域将用户数据存储在类似的cookie中,当用户想要从一个域跳转到另一个域而不在新域上验证自己时,在查询字符串中提供带有加密令牌的“跳转链接”。新域将解密cookie,并确定用户是谁,然后为该域发出新cookie。你希望“jumplink”有一个非常短的截止日期,所以我不会直接在页面中生成它们,而是生成指向“jumplink”生成器和重新导演的链接。
这可能没有必要,但“jumplink”的接收页面可以使Web服务回调到原始域,以验证加密令牌的真实性以及它是否已过期。
我认为这种解决方案容易受到中间人攻击(不确定它是否会比目前流行的其他auth机制更多),但是你可以将客户端MAC地址和IP地址合并到加密令牌以增加安全性。