【发布时间】:2013-12-07 12:35:28
【问题描述】:
我们不久前将我们的网站转移到了一个新的主机上,并且偶尔会遇到人们无法再注销的问题。不确定这是否与托管环境或代码更改有关。
这是相关位的 Wireshark 日志 - 所有都发生在同一个 TCP 流中。
-
来自浏览器的注销请求(注意身份验证 cookie):
GET /cirrus/logout HTTP/1.1 Host: subdomain.domain.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://subdomain.domain.com/cirrus/CA/Admin/AccountSwitch Cookie: USER.AUTH=AOvDEjH3w6xIxUC0sYNOAQR5BZ7pPmEF0RMxqohERN87Ti03Eqxd7rQC/BveqmaszmFg8QoSonP+Z+mtQQivKpvloFsQYretYKR8ENubj+moUBF479K5e4albKxS9mBEWT5Xy/XCnEyCPqLASGLY09ywkmIilNU1Ox4J3fCtYXHelE/hyzuKe9y3ui5AKEbbGs3sN9q1zYjVjHKKiNIGaHvjJ2zn7ZUs042B82Jc9RHzt0JW8dnnrl3mAkN1lJQogtlG+ynQSCyQD8YzgO8IpOnSXLJLaCMGMQcvSyX4YKJU/9sxgA5r5cZVCkHLsReS3eIJtXoxktMO6nxVZJY6MX1YwuJOgLRQvwBy9FFnQ6ye X-LogDigger-CliVer: client-firefox 2.1.5 X-LogDigger: logme=0&reqid=fda96ee5-2db4-f543-81b5-64bdb022d358& Connection: keep-alive -
服务器响应。它清除 cookie 值并重定向
HTTP/1.1 302 Found Server: nginx Date: Fri, 22 Nov 2013 14:40:22 GMT Content-Type: text/html; charset=utf-8 Content-Length: 124 Connection: keep-alive Cache-Control: private, no-cache="Set-Cookie" Location: /cirrus Set-Cookie: USER.AUTH=; expires=Fri, 22-Jul-2005 14:40:17 GMT; path=/cirrus X-Powered-By: ASP.NET X-UA-Compatible: chrome=IE8 <html><head><title>Object moved</title></head><body> <h2>Object moved to <a href="/cirrus">here</a>.</h2> </body></html> -
浏览器遵循重定向,但使用旧的 cookie 值:
GET /cirrus HTTP/1.1 Host: subdomain.domain.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://subdomain.domain.com/cirrus/CA/Admin/AccountSwitch Cookie: USER.AUTH=AOvDEjH3w6xIxUC0sYNOAQR5BZ7pPmEF0RMxqohERN87Ti03Eqxd7rQC/BveqmaszmFg8QoSonP+Z+mtQQivKpvloFsQYretYKR8ENubj+moUBF479K5e4albKxS9mBEWT5Xy/XCnEyCPqLASGLY09ywkmIilNU1Ox4J3fCtYXHelE/hyzuKe9y3ui5AKEbbGs3sN9q1zYjVjHKKiNIGaHvjJ2zn7ZUs042B82Jc9RHzt0JW8dnnrl3mAkN1lJQogtlG+ynQSCyQD8YzgO8IpOnSXLJLaCMGMQcvSyX4YKJU/9sxgA5r5cZVCkHLsReS3eIJtXoxktMO6nxVZJY6MX1YwuJOgLRQvwBy9FFnQ6ye X-LogDigger-CliVer: client-firefox 2.1.5 X-LogDigger: logme=0&reqid=0052e1e1-2306-d64d-a308-20f9fce4702e& Connection: keep-alive
Set-Cookie 标头中是否有任何明显的缺失可能会阻止浏览器删除 cookie?
要更改现有 cookie 的值,以下 cookie 参数必须匹配:
- 姓名
- 路径
- 域
名称和路径是明确设置的,域不是。会不会是这个问题?
编辑:因为有人问过为什么过期日期设置在过去,所以需要更多背景信息。 这是使用 AppHarbor 安全插件的轻微修改:https://github.com/appharbor/AppHarbor.Web.Security 修改是包含 cookie 的路径。请在此处找到修改后的注销方法:
public void SignOut(string path)
{
_context.Response.Cookies.Remove(_configuration.CookieName);
_context.Response.Cookies.Add(new HttpCookie(_configuration.CookieName, "")
{
Expires = DateTime.UtcNow.AddMonths(-100),
Path = path
});
}
过去的过期日期由 AppHarbor 插件完成,是常见的做法。见http://msdn.microsoft.com/en-us/library/ms178195(v=vs.100).aspx
【问题讨论】:
-
丢弃cookie服务器端而不是客户端不是更明智吗?
-
这样做实际上更安全,持续会话只会暴露风险。
标签: authentication cookies logout