这是一个咆哮,也是一个问题。
有些网站,例如 Facebook,您一次只想登录一个帐户。
但是从博客网站到电子邮件的所有内容总是会迫使您在登录另一个帐户之前先注销。
而且我了解安全隐患,以及它将如何使基于 cookie 的会话变得更加复杂,但为什么我们看不到更多呢?
为什么同时来自单个客户端的多个用户是个坏主意?
这是一个咆哮,也是一个问题。
有些网站,例如 Facebook,您一次只想登录一个帐户。
但是从博客网站到电子邮件的所有内容总是会迫使您在登录另一个帐户之前先注销。
而且我了解安全隐患,以及它将如何使基于 cookie 的会话变得更加复杂,但为什么我们看不到更多呢?
为什么同时来自单个客户端的多个用户是个坏主意?
我认为这应该由浏览器通过允许多个会话来实现,每个会话都使用自己的 cookie/身份验证/等。
这可能是最好的解决方案,因为它似乎适用于所有站点,并且不需要对它们进行更新,而且,虽然我对此了解不多,但实施起来似乎也不是非常困难.
简单的问题是大多数会话都是通过 cookie 实现的,没有 cookie 几乎没有办法做到这一点。
cookie 的工作方式是绑定到域/路径,并且发送与该域相关的所有 cookie。
因此,如果您允许通过 2 个不同的 cookie 登录两次,问题将是每个连续页面都会发送BOTH cookie,并且看到这两个 cookie 的服务器不知道您正在充当哪个“用户”。
解决这个问题的唯一方法是在所有链接周围传递一个“线程”标识,(即,即时重写每个站点链接foo.bar?thread=2
或thread=1
指示要使用哪个会话),这是一场彻头彻尾的噩梦,更不用说安全了影响。
唯一真正的方法是通过浏览器沙盒,用户告诉浏览器给定选项卡和所有分支使用一个 cookie 集,而另一个选项卡和所有分支使用另一个。
从本质上讲,这不是网站可以以实际方式解决的问题。
如果不将控件委托给浏览器来实现,并让用户手动指示他们何时想要分叉到新会话中,那么实际上没有好的方法来存储这些信息。
“为什么同时来自一个客户的多个用户是个坏主意?”
这根本不是一个坏主意,但是 HTTP 的使用迫使我们走这条路。
大多数客户端/服务器协议都是有状态的——客户端在握手期间只需要验证一次,然后会话由套接字连接表示。如果您失去连接,您将失去会话并且必须重新进行身份验证。然后编写在一个进程中允许多个会话(作为相同或不同用户)的应用程序是微不足道的。
HTTP 是无状态的。客户端需要以某种方式对每个请求进行重新身份验证。身份验证信息通常存储在 cookie 中,因此一旦完成初始身份验证,用户就不必参与其中。然而,Cookie 是全局的——不仅在进程中是全局的,而且通常跨应用程序的实例/调用。因此,您被困在一个会话中。
您可能会认为 Web 应用程序设计人员会将这种巨大的限制视为 HTTP 不是用于客户端/服务器应用程序开发的正确协议的标志。
多次登录的一个含义是如何管理权限。假设我有两个帐户,一个具有删除用户帐户的权限,而我的另一个帐户没有此权限。
如果我可以同时登录我的两个帐户(优先),我是否具有两个帐户的权限的联合,或者只有两个帐户拥有的权限的交集?
如果我拥有特权联合,我是否能够以赋予我太多权力的方式组合来自这些多个帐户的特权?这对 Sarbanes-Oxley 合规性意味着什么?
在 SQL 中可以看到与作为特权组的“角色”相关的等效问题。在标准 SQL 中,允许给定帐户采用多个角色,但一次只能采用一个角色。这可以防止您行使过多的特权。
您可以通过创建新配置文件在 Firefox 中执行多个会话 - 运行:firefox.exe -P 在这里您可以设置具有不同 cookie 的多个配置文件 - 您可以使用 firefox.exe 同时运行多个 firefox 会话-P "profileName" -no-remote 。no remote 将只允许每个会话 1 个窗口,但也将同时允许多个会话。
Cookie 状态锚定到主机标头...
使用不同的主机名或直接使用其 IP 地址连接到站点。根据站点的不同,您可以为站点设置一堆本地主机别名,从而允许您多次登录,因为每个别名都有自己的 cookie 状态。
如果站点重定向到自身以强制使用特定的主机标头,则别名将不起作用,您将需要使用多个浏览器。
自从你第一次写这个问题以来,IE 8 已经正式发布,它有一个内置的功能可以满足你的需求。从“文件”菜单中,单击“新会话”。这将打开一个新窗口,该窗口不会与原始窗口共享会话 cookie,从而允许您以不同的登录名同时登录到同一站点。
http://blogs.msdn.com/ie/archive/2009/05/06/session-cookies-sessionstorage-and-ie8.aspx