Single sign on 基于Cookie的单点登录

Single sign on 基于Cookie的单点登录,single-sign-on,Single Sign On,如何在没有sso服务器的情况下实现基于cookie的单点登录? 我希望通过使用在多个应用程序中共享登录的用户 浏览器上只有一个cookie 在我看来,它是这样工作的: 用户登录应用程序 应用程序验证凭据,然后在上设置cookie 存储用户名(可以用私钥编码)的浏览器 如果用户打开另一个应用程序,它将搜索cookie并读取 值上的用户名(使用用于解码字符串的键) 在此解决方案中,用户可能会看到(另一个用户的)浏览器cookie 并获取用户名的编码字符串。然后他可以把它加上去 自己的饼干(不好!

如何在没有sso服务器的情况下实现基于cookie的单点登录? 我希望通过使用在多个应用程序中共享登录的用户 浏览器上只有一个cookie

在我看来,它是这样工作的:

  • 用户登录应用程序
  • 应用程序验证凭据,然后在上设置cookie 存储用户名(可以用私钥编码)的浏览器
  • 如果用户打开另一个应用程序,它将搜索cookie并读取 值上的用户名(使用用于解码字符串的键)
在此解决方案中,用户可能会看到(另一个用户的)浏览器cookie 并获取用户名的编码字符串。然后他可以把它加上去 自己的饼干(不好!)

有什么安全的方法吗?使用基于时间戳的控件或 像这样的

提前谢谢

再见

附言。
我知道我的英语不是很好。。对不起

这是不可能的。Cookie对于每个域都是唯一的,一个域无法读取另一个域的Cookie。

您可以跨子域访问Cookie,但我认为使用浏览器Cookie不是一个很好的解决方案。实现单点登录确实不需要“SSO服务器”。很容易找到两个应用程序都能识别的有效负载。我见过使用XML通过HTTPS传输有效负载的自定义SSO解决方案。

这里有一个解决方案(希望它能得到安全专家的严格审查):

让每个域将用户数据存储在一个类似的cookie中,当用户想要从一个域跳到另一个域而不在新域上进行身份验证时,在查询字符串中提供一个带有加密令牌的“jumplink”。新域将解密cookie,并找出用户是谁,然后为该域向他们发布一个新cookie。您可能希望“jumplink”有一个非常短的过期日期,因此我不会直接在页面中生成它们,而是生成指向“jumplink”生成器和重新控制器的链接

这可能不是必需的,但是“jumplink”的接收页面可以向发起域进行web服务回调,以验证加密令牌的真实性以及该令牌是否已过期


我认为这个解决方案很容易受到中间人攻击(不确定它是否比目前流行的其他身份验证机制更容易受到攻击),但您可以将客户端MAC地址和IP地址合并到加密令牌中以获得额外的安全性。

我也做过类似的事情。有一个PHP应用程序,用户登录,系统联系web服务,然后服务在Active Directory上检查用户的凭据。当用户通过身份验证时,其PHP会话存储在数据库中。另一个web应用程序可以从Cookie中读取PHP会话并查询PHP应用程序中的web服务,PHP应用程序检查数据库中的会话并返回用户id。这样,我就有了一个使用SOA的SSO

不要依赖浏览器中存储的用户id,这是一个安全错误,至少要加密id

最好的解决方案是将登录表单和会话存储放在同一个应用程序中,然后该应用程序可以向其他应用程序提供服务

并使用HTTPS进行信息交换

只有当Cookie属于同一域时,才能读取Cookie,例如:

intranet.example.com crm.example.com
example.com/erp

有一个简单的解决方案,不使用sso服务器,但不使用一个公共cookie,因为我们知道cookie不会在域之间共享

当用户在site-a.com上进行身份验证时,您在site-a.com域上设置了cookie。然后在site-b.com上,从site-a.com链接一个动态javascript,由服务器端脚本(php等)生成,该脚本可以访问创建的cookie,然后使用js在客户端复制site-b.com上的相同cookie。现在两个站点都有相同的cookie,无需要求用户重新登录

您可以使用site-a和site-b都知道如何解码的方法对cookie值进行加密/编码,以便site-b能够验证其cookie副本。使用一个公共的共享秘密,没有它就无法编码或解码


您可以看到,在site-b.com的第一次页面加载中,cookie不存在,因此,如果您认为有必要,您可能希望在设置cookie后重新加载页面

我想答案来得有点晚,但也许我可以帮助别人

您可以使用iframe将中间域中的cookie/localStorage连接到主页

1) 登录 任何域中的登录表单通过事件(postMessage)将标识令牌存放在sso.domain.com上的cookie中 2) 核实 domain1和domain2包含一个指向sso.domain.com的iframe,它读取令牌并通知主页


为了简化开发,我们最近发布了一个跨域SSO,JWT位于

+1是的,不允许跨域Cookie,而且通常是个坏主意。即使我设置了不同的域(如果可能的话)?你也不能设置不同的域。浏览器不允许这样。想想这会有多危险——一个恶意网站能够为你的在线银行网站设置cookies……如果域有一个共同的主域,cookies可以共享
foo.example.com
bar.example.com
可以共享
.example.com
cookie。您能更好地解释这个解决方案吗?谢谢在发布cookie时(如果您一直在使用为您编写cookie的web堆栈的功能,而没有问您太多问题,您可能需要稍微弄脏您的手),只需在域中输入“.yourdomian.com”,而不是“yousubdomain.yourdomain.com”在这种情况下,用户必须点击一个特殊的链接才能跳转到另一个站点,对吗?我不