2010-10-28 30 views
7

我試圖確保我目前正在開發使用ASP.NET MVC 2.0和表單身份驗證的網站。爲了保護表單身份驗證Cookie,我希望將requiresSSL屬性設置爲true,以便只有當連接處於SSL狀態時,cookie才由瀏覽器發送,並且顯然確保所有需要授權的資源都處於SSL狀態。卸載SSL時確保表單身份驗證Cookie

我的問題是,我們正在使用應用程序請求路由來完成許多功能,一個是SSL卸載,因此,當請求遇到我們場中的任何Web服務器時,請求不再處於SSL和FormsAuthentication之下。 SetAuthCookie方法失敗,因爲需要SSL連接以在需要SSL指定時設置cookie。

任何人有任何想法,在這裏工作!

感謝

+0

+1,我也會對這個問題的解決方案感興趣。 – 2010-10-28 15:25:31

回答

3

所以我有一個工作圍繞這一點,但如果任何人有任何更好的想法,請隨時發表評論。實質上,您需要在請求結束時截獲響應,並在表單身份驗證Cookie上手動設置Secure屬性,這很明顯,您還需要將Forms身份驗證配置中的requireSSL屬性設置爲false。另外請記住,我們不希望爲整個網站啓用HTTPS以便通過身份驗證的用戶,因此可以解決此問題。

這種方法有幾個注意事項,需要注意的幾件事情。

  1. 我測試該窗體身份驗證cookie總是寫在響應過程中發現,所以我一直覆蓋在瀏覽器中有效的身份驗證cookie與一個空驗證cookie,來解決這個問題我包括在一些邏輯HTTP模塊來解決這個問題,請參閱下面的代碼片段。

  2. 對需要授權的應用程序的所有請求都必須在SSL之下,否則請求將不包含驗證cookie以驗證用戶身份。

  3. 由於您只傳遞SSL請求的身份驗證Cookie,因此您需要使用另一種機制來告訴您的應用程序當前用戶在瀏覽網站的非SSL區域時進行了身份驗證,我已經使用其他cookie實施了此操作這是在用戶登錄時設置的,並且沒有設置過期日期,因此將在用戶會話結束時過期,當用戶註銷時該cookie將被刪除。

下面是一個HTTP模塊實現的影響上面的邏輯,我一直在這最後幾個小時測試和跨越任何問題都還​​沒來,我會知道,如果要更新這個帖子我做!如果用戶剛剛登陸這裏


我們應該永遠只能發送身份驗證cookie到客戶端的邏輯

  1. 如果請求有一個權威性的cookie的用戶已經通過身份驗證 和SSL下所以請確保我們不會在 響應中發送新的身份驗證Cookie。
  2. 如果請求中沒有auth cookie,但響應中存在有效的 auth cookie,請將響應auth cookie設置爲安全, ,以便它僅由SSL下的瀏覽器傳輸。
  3. 如果請求沒有auth cookie,並且響應中有一個 無效或空的auth cookie,請確保我們刪除了響應cookie ,以便我們不覆蓋客戶端瀏覽器中的有效cookie。
private void EndRequest(object sender, EventArgs e) 
{ 
    var application = (HttpApplication)sender; 

    if (ValidRequest(application.Request) && application.Response.Cookies.Count > 0) 
    { 

     //only do the below if the user is not logging out the site, if the user is logging out we can 
     //leave the default forms authentication behaviour which is to expire the auth cookie 
     if (application.Request.AppRelativeCurrentExecutionFilePath != "~/authentication/logoff") 
     { 
      var requestAuthCookie = application.Request.Cookies[FormsAuthentication.FormsCookieName]; 
      var responseAuthCookie = application.Response.Cookies[FormsAuthentication.FormsCookieName]; 

      if (requestAuthCookie != null && responseAuthCookie != null && responseAuthCookie.Value.IsNullOrEmpty()) 
      { 
       application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
      } 
      else if (responseAuthCookie != null && !responseAuthCookie.Value.IsNullOrEmpty()) 
      { 
       responseAuthCookie.Secure = true; 
       application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
       application.Response.Cookies.Add(responseAuthCookie); 
      } 
      else if (responseAuthCookie == null || responseAuthCookie.Value.IsNullOrEmpty()) 
      { 
       application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
      } 
     } 
    } 
} 
2

SSL卸載應該讓你做出從SSL卸載器到Web服務器SSL連接。

從SSL Offloader到Web服務器的SSL連接應該使用最輕,最快(也可能最弱)的加密。

這使您可以使用安全cookie,減少服務器上的加密負載並避免修改代碼。

+0

好主意,但是引入了一個額外的關於卸載器和服務器之間的證書的額外層。如果沒有 – Anthony 2013-04-17 13:44:10

+0

,我很同意你的看法。這就是說... 我看到的最常見的解決方案是在沒有客戶端(SSL卸載程序)身份驗證的情況下,在SSL卸載程序和服務器之間建立連接。如果這個連接通過一個可信賴的網絡,它甚至可以清楚。 如果您需要嚮應用程序提供客戶端證書信息,則可以將證書信息放入HTTP標頭(這需要修改應用程序) – 2013-05-02 14:11:17