0

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

考虑这些子域:

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

我怎样才能让它工作?

4

2 回答 2

2

您无法仅通过 cookie 设置来解决此问题,域​​属性的目的是防止这种情况发生。

如果 forum.mydomain.com 和 account_a.mydomain.com 绝对需要使用相同的身份验证 cookie,您需要将其设置为 .mydomain.com 并有一些逻辑确保它在 account_b.mydomain.com 中无效

于 2012-10-12T11:38:24.657 回答
1

唯一可以创建特定域 cookie 的是在您正在创建的域上解析的机器。如果您想创建一个名为的 cookie,account_a.mydomain.com则必须从该特定域访问您的服务器的 url。鉴于此,不可能account_a.mydomain.com创建特定于的 cookie,forum.mydomain.com因为它们是完全独立的地址。任何创建此类 cookie 的尝试实际上都会为account_a.forum.mydomain.com.

至于如何让它工作,你还没有真正说明为什么你首先要以这种方式修改 cookie,所以这很难说。每个浏览器只能为用户拥有一个有效的身份验证 cookie,并且这些 cookie 对浏览器的所有实例都是通用的,因此实际上不可能让 account_a 的 cookie 验证 account_b,而这两个 cookie 不能无论如何都住在同一台机器上。域级身份验证的目的之一是防止这种同时多重性。

编辑:( 回复评论)

在您希望用户能够穿越到多个域服务器的场景中,您不需要接触 cookie 本身。它会自动将自己绑定到mydomain.com域并允许这样的遍历。尝试在全局对象上应用单独的系统级安全机制只是有点倒退。打个比方,你不会用带刺铁丝网围住你房子周围的栅栏,以防止有人进入你的地下室。需要在该服务器级别应用防止account_a访问域的身份验证控制。account_b我的猜测是,您有某种形式的通用代码,其中域针对身份验证进行了合理化,因此您真正需要做的是处理实际授权。

一种方法是将一些自定义代码添加到 Page 基类的 Init 或 Load 事件中。BeginRequest此外,您可以在 global.asax 中为事件添加一段逻辑。我见过使用的一种技术(尽管我自己从未使用过)是添加到 global.asax 中的 AuthorizeRequest 事件。我找不到任何描述该主题的文档,但我确实找到了一个显示它是如何完成的示例的文档。https://nport.svn.codeplex.com/svn/jacky/ccs/CCWeb/Global.asax.cs

于 2012-10-12T11:29:20.690 回答