2012-10-03 48 views
2

我實現防僞框架如下所述:ASP.NET MVC3 - 反CSRF和會話超時

http://weblogs.asp.net/srkirkland/archive/2010/04/14/guarding-against-csrf-attacks-in-asp-net-mvc2.aspx

另外,儘量減少編碼工作,我沒有在客戶令牌插入部分側處理form.onsumitajaxsend事件。一切正常 - 直到會話過期。

在我的申請,我顯示彈出當用戶會話被超時,用戶可以重新登錄並繼續無需刷新當前頁面,這樣的工作在進展會很安全。但是這與Anti-CSRF邏輯不一致。當用戶嘗試超時的會議結束後重新登錄,這將引發一個CSRF例外,因爲該cookie(__RequestVerificationToken_Lw__)已經過期,所有未來的職位將被無效,直到下一次刷新頁面。

有什麼辦法來cookie的結束時間設置爲將來的日期,而不是「會話」?我試圖編輯Response.Cookie但這使cookie無效。

任何幫助,將不勝感激。 謝謝

+0

你可以使用jQuery和$ .cookie( 「RequestVerificationToken_Lw」,1,{到期:10});這將在1天內過期cookie(您可以自定義到不同的時間範圍) –

+0

感謝@DarrenDavies的回覆。但這些cookies很安全,不能使用javascript訪問。 – w3dev

回答

0

在用戶會話結束時(顯示彈出窗口時)是否可以在服務器端設置httpcookie到期。

我已經提取了一些代碼從微軟的防僞標記的實現。

internal static string GetAntiForgeryTokenName(string appPath) 
     { 
      if (string.IsNullOrEmpty(appPath)) 
      { 
       return "__RequestVerificationToken"; 
      } 
      return "__RequestVerificationToken_" + Base64EncodeForCookieName(appPath); 
     } 

    private static string Base64EncodeForCookieName(string s) 
    { 
     byte[] bytes = Encoding.UTF8.GetBytes(s); 
     string text = Convert.ToBase64String(bytes); 
     return text.Replace('+', '.').Replace('/', '-').Replace('=', '_'); 
    } 

下面的代碼在服務器端設置cookie。

string antiForgeryTokenName = GetAntiForgeryTokenName(HttpContext.Request.ApplicationPath); 
      HttpCookie httpCookie = HttpContext.Request.Cookies[antiForgeryTokenName]; 

      HttpCookie httpCookie2 = new HttpCookie(antiForgeryTokenName, httpCookie.Value) 
      { 
       HttpOnly = true 
       //// your domain Domain = , 
       //// path Path = , 
       //// set path Expires = 
      }; 

      HttpContext.Response.Cookies.Set(httpCookie2); 

請注意,我沒有測試過這個代碼,只是試一試,如果你沒有任何其他選項。

+0

這工作得很好!謝謝。 – w3dev