我們不久前將我們的網站移動到新的託管服務器,並且偶爾會遇到人們無法註銷的問題。不確定這與主機環境或代碼更改有什麼關係。通過Set-Cookie註銷失敗
這是相關位的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參數必須匹配:
- 名
- 路徑
- 域
名和路徑explecitely設置,域不是。這可能是問題嗎?
編輯:由於有人問過爲什麼在過去設置過期日期,因此需要更多背景。 這是對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服務器端而不是客戶端不是更明智嗎? – flup
這樣做實際上更安全,持續的會話只會暴露風險。 – zinking