2012-10-03 4 views
2
여기에 설명 된대로 내가 위조 방지 프레임 워크를 구현하고

:ASP.NET MVC3 - 안티 CSRF 및 세션 제한 시간

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

플러스, 코딩 노력을 최소화하기 위해, 나는 클라이언트에서 토큰 삽입 부했다 side handling form.onsumitajaxsend 이벤트. 세션이 만료 될 때까지 모든 것이 잘 작동합니다.

내 응용 프로그램에서 사용자 세션이 시간 초과되어 사용자가 다시 로그인하여 현재 페이지를 새로 고치지 않고 계속 진행할 수있을 때 팝업을 표시하여 진행중인 작업이 안전 할 수 있도록합니다. 그러나 이것은 Anti-CSRF 논리와 잘 맞지 않습니다. 사용자가 제한 시간이 초과 된 세션 후에 다시 로그인하려고하면 쿠키 (__RequestVerificationToken_Lw__)가 이미 만료되고 다음 페이지를 새로 고칠 때까지 모든 향후 POST가 유효하지 않으므로 CSRF 예외가 throw됩니다.

'세션'이 아닌 쿠키 종료 시간을 미래의 날짜로 설정할 수있는 방법이 있습니까? Response.Cookie을 편집하려고 시도했지만 쿠키가 유효하지 않습니다.

어떤 도움

주시면 감사하겠습니다. 감사합니다.

+0

jQuery와 $ .cookie ("RequestVerificationToken_Lw", 1, {expires : 10})를 사용할 수 있습니다. 1 일 만에 쿠키가 만료됩니다 (다른 시간대로 사용자 정의 할 수 있음). –

+0

답장을 위해 @DarrenDavies에게 감사드립니다. 그러나 이러한 쿠키는 httponly이며 자바 스크립트를 사용하여 액세스 할 수 없습니다. – w3dev

답변

0

사용자 세션을 종료 할 때 (팝업을 표시 할 때) 서버 측에서 만료가 설정된 httpcookie를 설정할 수 있습니다.

나는 microsofts antiforgery 토큰 구현에서 일부 코드를 추출했습니다.

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('=', '_'); 
    } 

아래의 쿠키를 서버 측에 설정 한 코드는 다음과 같습니다.

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