表单身份验证和身份验证票证cookie域

时间:2013-03-10 20:59:12

标签: asp.net cookies forms-authentication subdomain

我正在尝试配置DEV环境以支持具有共享身份验证和它们之间会话的子域。

目前,我在DEV计算机上配置了IIS和hosts文件来处理对mydomain,sd1.mydomain,sd2.mydomain,sd3.mydomain的请求。 Web应用程序本身按预期工作,我可以浏览所有子域上的所有页面,但需要身份验证的页面除外。当我尝试登录时,服务器端的一切看起来都很完美(找到用户,创建cookie并添加到响应中),但cookie没有到达浏览器(我尝试过Chrome和IE)。

我有一个创建和存储身份验证票据的代码,我在web.config中的authentication.forms中设置了domain =“。mydomain”:

var now = DateTime.UtcNow.ToLocalTime();

var ticket = new FormsAuthenticationTicket(
 1 /*version*/, _user.Username, now, now.Add(FormsAuthentication.Timeout),
isPersistentCookie, _user.Username, FormsAuthentication.FormsCookiePath);

var encryptedTicket = FormsAuthentication.Encrypt(ticket);

var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.HttpOnly = true;
if (ticket.IsPersistent)
{
     cookie.Expires = ticket.Expiration;
}
cookie.Secure = FormsAuthentication.RequireSSL;
cookie.Path = FormsAuthentication.FormsCookiePath;
if (FormsAuthentication.CookieDomain != null)
{
     cookie.Domain = FormsAuthentication.CookieDomain;
}

_httpContext.Response.Cookies.Add(cookie);

当我调试时,上面的代码工作正常,用户是正确的,并且具有正确域的cookie被添加到响应中。

如果我从web.config中删除domain =“。mydomain”,则身份验证有效,但仅适用于mydomain而不适用于子域。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

domain=移除开头的点,您必须将domain=".mydomain.com"作为http://www.w3.org/Protocols/rfc2109/rfc2109(第7页)中所述的第一个点,感谢您的评论@AlbatrossCafe

此设置同时适用于Cookie和身份验证。

答案 1 :(得分:1)

没错。如果cookie未提供域,则该cookie应仅适用于发布域。