我正在尝试在两个子域上登录用户。
考虑这些子域:
forum.mydomain.com,account_a.mydomain.com,account_b.mydomain.com。
用户登录account_a.mydomain.com。在我的身份验证功能中,我想为forum.mydomain.com创建身份验证cookie。 (但不是(!)对于account_b.mydomain.com)
我尝试创建一个cookie并将.domain属性设置为forum.mydomain.com,但不知何故cookie未创建。将.domain属性设置为.mydomain.com不是我想要的,因为它会产生安全问题,因为account_a和account_b是两个完全不同的用户。
我怎样才能让它发挥作用?
答案 0 :(得分:2)
单独使用cookie设置无法解决此问题,域属性的目的是防止这种情况。
如果forum.mydomain.com和account_a.mydomain.com都需要使用相同的身份验证Cookie,则需要将其设置为.mydomain.com并设置一些逻辑,以确保它在account_b.mydomain.com中无效
答案 1 :(得分:1)
唯一可以创建特定域cookie的是在您正在创建的域上解析的计算机。如果要创建名为account_a.mydomain.com
的cookie,则必须从该特定域访问您的服务器URL。鉴于此,account_a.mydomain.com
无法创建特定于forum.mydomain.com
的Cookie,因为它们是完全独立的地址。任何创建此类cookie的尝试都会为account_a.forum.mydomain.com
创建一个cookie。
至于如何使它工作,你还没有真正说明为什么你首先以这种方式修补cookie,所以很难说。每个浏览器只能为用户提供一个有效的身份验证cookie,并且cookie对于浏览器的所有实例都是通用的,因此实际上不可能为account_b的account_a验证使用cookie,并且这两个cookie不能无论如何都住在同一台机器上。域级别身份验证的目的之一是防止这种同时多样性。
修改: (对评论的回复)
在您希望用户能够访问多个域服务器的情况下,您无需触摸cookie本身。它会自动绑定到mydomain.com
域并允许这样的遍历。尝试在全局对象上应用单独的系统级安全机制只是稍微倒退一点。使用类比,你不会用铁丝网围绕你的房子围栏,以防止某人离开你的地下室。需要在该服务器级别应用用于防止account_a
访问account_b
域的身份验证控件。我的猜测是你有一些形式的公共代码,其中域与认证合理化,所以你真正需要做的是处理实际的授权。
一种方法是将一些自定义代码添加到Page baseclass的Init或Load事件中。此外,您可以为global.asax中的BeginRequest
事件添加一段逻辑。我见过的一种技术(尽管从未使用过它)是添加到global.asax中的AuthorizeRequest事件。我无法找到描述该主题的任何文档,但我确实找到了一个显示它如何完成的示例。 https://nport.svn.codeplex.com/svn/jacky/ccs/CCWeb/Global.asax.cs