Asp.net
使用 requireSSL=true 的表單身份驗證不返回具有 Secure 屬性的 cookie
現在我們已經將主機從 Win2K3/IIS6 升級到 Win2k8R2/IIS7.5,我看到來自 IIS 站點的奇怪響應。ASP.Net 4.0 版
我們有一個非常複雜和成熟的 Web 應用程序,它使用帶有以下配置的表單身份驗證:
<authentication mode="Forms"> <forms loginUrl="~/Login" timeout="2000" domain="xx.xx.com" requireSSL="true" /> </authentication>登錄 URL 指向正確配置為 SSL 的 ASP.Net MVC 3 頁面。
該站點在 IIS6 中按預期執行,但自從主機遷移後,成功登錄後,響應標頭中的 auth cookie 缺少 Secure 和 HttpOnly 屬性。這是有問題的,因為我們有一個包含許多 HTTP 頁面的混合內容站點。auth cookie 現在在每個請求中發送,而不僅僅是在通過 HTTPS 的請求中,並且現在對會話竊取漏洞開放。
我們的註銷連結成功發送了一個包含 Secure 和 HttpOnly 屬性的零長度 cookie。
這是從 Fiddler 成功登錄和註銷後的原始響應,經過編輯以保護無辜者 :)
Login Response: HTTP/1.1 200 OK Cache-Control: private Content-Type: application/json; charset=utf-8 Set-Cookie: .ASPXAUTH=83FCCA...102D; domain=xx.xx.com; path=/ Date: Fri, 25 Jan 2013 22:53:31 GMT Content-Length: 84 {...} Logoff Response: HTTP/1.1 302 Found Cache-Control: private Content-Type: text/html; charset=utf-8 Location: http://xx.xx.com/?... Set-Cookie: .ASPXAUTH=; domain=xx.xx.com; expires=Tue, 12-Oct-1999 04:00:00 GMT; path=/; secure; HttpOnly Set-Cookie: logoff=; path=/ Set-Cookie: ... Date: Fri, 25 Jan 2013 22:57:01 GMT Content-Length: 64053 <html><head><title>...更改應用程序池的集成管道設置無效。
以下是 cookie 創建程式碼的重要部分:
var ctx = HttpContextFactory.Current; var cookie = new HttpCookie( FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt( new FormsAuthenticationTicket( SessionId, false, Convert.ToInt32(FormsAuthentication.Timeout.TotalMinutes) ) ) ) { Domain = domain }; ctx.Response.Cookies.Add(cookie);關於從哪裡開始尋找導致這種情況的任何想法?
當您發出表單身份驗證 cookie 時,您所設置的只是域名。我看不到您在任何地方設置安全標誌。因此,如果您希望使用安全和 httponly 標誌設置 cookie,請確保在創建此 cookie 時已指定它們:
var cookie = new HttpCookie( FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt( new FormsAuthenticationTicket( SessionId, false, Convert.ToInt32(FormsAuthentication.Timeout.TotalMinutes) ) ) ) { Domain = domain, HttpOnly = true, Secure = FormsAuthentication.RequireSSL };由於您是手動創建表單身份驗證 cookie(而不是使用
FormsAuthentication.SetAuthCookie或FormsAuthentication.GetAuthCookie內置方法),因此 web.config 中的設置無效。您需要明確設置它們,如我的範例所示。