我正在尝试配置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而不适用于子域。
我做错了什么?
答案 0 :(得分:3)
从domain=
移除开头的点,您必须将domain=".mydomain.com"
作为http://www.w3.org/Protocols/rfc2109/rfc2109(第7页)中所述的第一个点,感谢您的评论@AlbatrossCafe
此设置同时适用于Cookie和身份验证。
答案 1 :(得分:1)
没错。如果cookie未提供域,则该cookie应仅适用于发布域。