Asp.net

使用 requireSSL=true 的表單身份驗證不返回具有 Secure 屬性的 cookie

  • January 26, 2013

現在我們已經將主機從 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.SetAuthCookieFormsAuthentication.GetAuthCookie內置方法),因此 web.config 中的設置無效。您需要明確設置它們,如我的範例所示。

引用自:https://stackoverflow.com/questions/14531853