为什么ASP.NET为域和子域生成相同的cookie密钥?

时间:2009-02-04 22:58:01

标签: asp.net authentication cookies forms-authentication subdomain

错误:

我有一个ASP.NET Web应用程序偶尔为“.www.mydomain.com”和“www.mydomain.com”设置相同的cookie密钥。我试图找出ASP.NET设置的默认cookie域,以及我是如何意外编码网站有时会添加“。”。到cookie域。

当2个cookie具有相同的密钥并从浏览器发送时,ASP.NET Web应用程序无法区分这两个,因为域值中未发送域值。 (见我的previous question

证据:

我在网络服务器上启用了W3C日志记录,并验证了两个cookie都是从客户端发送的。这是日志文件中的一个示例(为简洁配对)。

80 GET /default.aspx page= 200 0 0 - - - - - +MyCookie2=sessionID=559ddb9b-0f38-4878-bb07-834c2ca9caae;+MyCookie2=sessionID=e13d83cd-eac2-46fc-b39d-01826b91cb2c;

可能的因素:

我正在使用子域启用的表单身份验证。

这是我的web.config设置:

<authentication mode="Forms">
<forms domain="mydomain.com" enableCrossAppRedirects="true" loginUrl="/login" requireSSL="false" timeout="5259600" />
        </authentication>

以下是设置自定义Cookie的示例:

HttpCookie cookie1 = new HttpCookie("MyCookie1") {HttpOnly = true, Expires = expiration};
logosCookie["email"] = user.Email;
logosCookie["keycode"] = user.PasswordHash;
logosCookie["version"] = currentCookieVersion;
context.Response.Cookies.Remove("cookie1");
context.Response.Cookies.Add(cookie1);

// set FormsAuth cookie manually so we can add the UserId to the ticket UserData
var userData = "UserId=" + user.UserID;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, user.Email, now, expiration, true, userData);

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

context.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
context.Response.Cookies.Add(cookie1 );

这是设置cookie的另一个例子。

var cookie2 = new HttpCookie("MyCookie2");
cookie2[CookieSessionIdKey] = Guid.NewGuid();
cookie2.Expires = DateTime.Now.AddYears(10);
HttpContext.Current.Response.Cookies.Set(cookie2);

不良决议:

我可以手动强制cookie域为特定值,但我想避免明确声明域。我更喜欢使用默认的框架行为并改变我对ASP.NET的使用,以避免在“。”之前添加。到cookie域以获取自定义cookie。

1 个答案:

答案 0 :(得分:1)

如果服务器没有在响应中显式设置域,则浏览器可以自由分配cookie域值。我还没有确切知道在响应时没有提供域名的情况下,cookie域上的浏览器设置“www.mydomain.com”与“.mydomain.com”会产生什么条件,但是它确实发生了。

我感觉这是将.ASPAUTH cookie域值显式设置为“.mydomain.com”以启用跨子域身份验证,同时将其他自定义Cookie域设置为默认值(空字符串或“”)的结果

我将使用不受欢迎的解决方案,并明确为所有自定义Cookie设置Cookie域,以避免浏览器怪癖。