子域的.Net cookie

时间:2012-10-12 11:18:44

标签: asp.net .net cookies

我正在尝试在两个子域上登录用户。

考虑这些子域:

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是两个完全不同的用户。

我怎样才能让它发挥作用?

2 个答案:

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