基于Cookie的SSO

时间:2009-11-23 16:19:48

标签: single-sign-on

如何在没有sso服务器的情况下实现基于cookie的单点登录? 我想分享使用多个应用程序登录的用户 只有浏览器上的cookie。

在我看来,它的工作方式如下:

  • 用户登录应用程序
  • 应用程序验证凭据,然后设置cookie 浏览器存储用户名(可以用私钥编码)
  • 如果用户打开另一个应用程序,它会搜索cookie并读取 值上的用户名(使用解码字符串的键)

在此解决方案中,用户可能会看到(另一个用户的)浏览器cookie 并采用用户名编码的字符串。然后他可以添加它 一个自己的饼干(不好!)。

有一些安全的方法可以做到这一点吗?使用基于时间戳的控件或 这样的事情?

提前致谢。

再见

P.S。 我知道我的英语不是很好......对不起!

6 个答案:

答案 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

cross domain sso

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地址合并到加密令牌以增加安全性。