2

漏洞:

我有一个 ASP.NET Web 应用程序,它偶尔会为“.www.mydomain.com”和“www.mydomain.com”设置相同的 cookie 键。我试图弄清楚 ASP.NET 设置的默认 cookie 域,以及我如何不小心将站点编码为有时会在前面加上“。” 到 cookie 域。

当 2 个 cookie 具有相同的密钥并从浏览器向上发送时,ASP.NET Web 应用程序无法区分两者,因为域值未在标头中发送。(见我之前的问题

证据:

我已经在 Web 服务器上启用了 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 域。

4

1 回答 1

1

当服务器在响应中没有明确设置域时,浏览器可以自由分配 cookie 域值。当响应中没有提供域时,我还没有弄清楚究竟是什么条件导致浏览器在 cookie 域上设置“www.mydomain.com”与“.mydomain.com”,但它确实发生了。

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

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

于 2009-02-25T01:43:27.317 回答