ASP.NET子域Cookie(父域和一个子域)

时间:2010-01-31 16:53:08

标签: asp.net asp.net-mvc forms-authentication

我有一个包含多个子域的应用,subone.parent.com,subtwo.parent.com。

我在parent.com/login上有一个登录页面。当用户登录时,我会根据他们所属的域将其重定向到正确的域。这很好用。

FormsAuthenticationTicket ticket = new FormsAuth...
string encTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
cookie.Domain = subone.parent.com
Response.Cookies.Add(cookie)

这样可以为subone.parent.com而不是subtwo.parent.com正确验证用户身份。但是我想做以下几点。

如果用户返回parent.com,我想知道他们已登录并将其重定向回subone.parent.com。

有完成此操作的最佳做​​法吗?或者我是否必须为parent.com设置另一个cookie?

如果重要的话,我在asp.net mvc工作。

谢谢!

3 个答案:

答案 0 :(得分:5)

您可以像您尝试的那样在各个域之间共享Cookie,但不是直截了当,例如here

另一个选项是将cookie设置为“.parent.com”,而不是明确指定子域,并使用cookie存储子域的详细信息。然后,您可以从任何子域(以及父级假设其www.parent.com)访问cookie。

如果您使用MVC,您可以非常轻松地创建自定义过滤器并添加到www.parent.com控制器以检查cookie是否存在,如果是,则重定向到cookie指定的子域。过滤器的更多详细信息here

答案 1 :(得分:0)

我会像你那样设置显式域的cookie,因为它维护了特定域的cookie中的任何安全信息。您还可以在* .parent.com级别添加未加密的cookie,其中包含有关已经过身份验证的域的信息。虽然没有使用时间戳和应用程序之间的逻辑连接,但没有真正的方法将它们联系在一起(即 - sub2的会话超时为20分钟,因此如果域+有效时间戳出现在父cookie中它将是有效的,但这是商业逻辑。)

我不确定域名之间断开连接的原因,但您实际上可能更愿意使用加密文本后面加密文本的单个Cookie。 EG:

1)Sub1登录,将parent.com cookie设置为有效。将一条用户数据发送到身份验证Web服务。

2)身份验证服务将sub1识别为发件人,加密用户数据,并将其添加到自定义Cookie对象。

3)自定义cookie对象在唯一的拆分字符(或序列)上构造一个复合字符串,并使其可用于服务方法。

4)使用表单加密的服务加密整个票证并将其发送回原始登录。

这样每个服务器都可以解密全局票证,但每个数据片段将使用通用算法加密,但使用基于服务器的盐。因此,如果sub2尝试从sub1读取cookie数据,它将获得加密版本而不是原始数据。

答案 2 :(得分:0)

您可以在所有子域上共享同一会话。这是我们用来实现的代码:-)

void MasterPage_Unload(object sender, EventArgs e)
{
   ///ASP.NET uses one cookie per subdomain/domain,
   ///we need one cookie for _all_ subdomains.
   if (Context.Response.Cookies["ASP.NET_SessionId"] == null)
      return;

   var sessionCookie = new HttpCookie("ASP.NET_SessionId", Context.Session.SessionID);
   sessionCookie.Domain = ".yourdomain.com" ; 
   Context.Response.SetCookie(sessionCookie);
 }
Page_Load方法中的

是:

 Unload += MasterPage_Unload;

效果很好:-)

罗伯特