使用 FormsAuthentication 的跨域 Cookie

Posted

技术标签:

【中文标题】使用 FormsAuthentication 的跨域 Cookie【英文标题】:Cross Domain Cookies With FormsAuthentication 【发布时间】:2010-10-07 22:53:51 【问题描述】:

我知道相关的安全风险并已向企业提出,但他们希望让他们的 5 个域共享登录 cookie。

我们正在使用并且没有计划停止使用 ASP.Net 成员资格和配置文件。这可能吗?黑客甚至会不胜感激。

【问题讨论】:

【参考方案1】:

使用开箱即用的 ASP.NET 是不可能的。

基于表单的身份验证基于 cookie,cookie 只能设置到特定域。

如果您想要真正的跨域(而不是子域)共享身份验证,则需要单点登录解决方案。

我自己推出了自己的产品,而且相对简单。基本原则是您有一个主域来保存您的身份验证 cookie(票证)。然后,您从所有其他域重定向到该域。它不是很漂亮,但是 Microsoft Passport 就是这样工作的。

你可以在网上找到很多例子,看看这两个链接:

Authentication cookies

Cross domain authentication

【讨论】:

在第二个链接上,如果您在运行演示时遇到问题,因为“密钥在指定状态下无法使用。”,请尝试以下操作:确保密钥文件实际上是在您认为的位置创建的.示例代码似乎包含一个密钥文件,但我们当然想自己制作。为了保存密钥文件(tripleDES.key),我首先必须在 Enterprise Library Configuration 工具中保存配置(右键单击,保存)。保存配置后,我的密钥文件也立即保存,我可以运行演示应用程序。【参考方案2】:

这不仅在 ASP.Net 中是不可能的,而且根本不可能。 Cookie 始终是特定于域的 - 没有任何商业浏览器可以以任何其他方式工作。这是设计使然,对于防止广泛滥用 cookie 非常必要。 Muerte 为您指明了正确的方向(单点登录)。

【讨论】:

【参考方案3】:

您可以将所有这些域设置为您公司的子域:

www.company.com
shop.company.com
sales.company.com
research.company.com
..

然后您将能够将 cookie 设置为父域,并且它将对所有子域可见。

var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
cookie.Domain = ".company.com";
Repsonse.Cookies.Add(cookie);

问候, 马克斯·切尔尼绍夫 http://prontocoder.com

【讨论】:

以上是关于使用 FormsAuthentication 的跨域 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

FormsAuthentication 的持久 cookie 超时

防止 FormsAuthentication 覆盖 WCF REST 中的响应状态

FormsAuthentication使用指南

Firefox不允许我使用FormsAuthentication设置持久性cookie

FormsAuthentication.SetAuthCookie 方法登录

Cookie 与 FormsAuthentication.SetAuthCookie() 方法混淆