2014-03-24 4 views
1

ajax 요청에서 위조 방지를 처리하기 위해 this solution을 구현하고 싶습니다. 나는 다른 솔루션이 있다는 것을 알고 있지만 이것은 내가 가장 좋아하는 솔루션입니다.MVC3의 AntiForgery 쿠키

문제는 System.Web.Webpages 1.0을 처리해야하므로 내 코드에서 AntiForgeryConfig.CookieName을 사용할 수 없습니다.

public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 

     // Only validate POSTs 
     if (request.HttpMethod == WebRequestMethods.Http.Post) 
     { 
      // Ajax POSTs and normal form posts have to be treated differently when it comes 
      // to validating the AntiForgeryToken 
      if (request.IsAjaxRequest()) 
      { 
       string cookieName = AntiForgeryData.GetAntiForgeryTokenName(context.Request.ApplicationPath); 
       var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName]; 

       var cookieValue = antiForgeryCookie != null 
        ? antiForgeryCookie.Value 
        : null; 

       AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]); 
      } 
      else 
      { 
       new ValidateAntiForgeryTokenAttribute() 
        .OnAuthorization(filterContext); 
      } 
     } 
    } 

어떻게 Mvc3에서 위조 방지 시스템에 의해 설정된 쿠키 이름을 (프로그래밍 방식으로) 검색 할 수 있습니까? 나는 AntiForgery.Validate 부분도 문제가 될 것으로 의심하지만 전에는 그것을 처리 할 것입니다. 이견있는 사람?

답변

0

실제 쿠키 이름은 항상 "__RequestVerificationToken"에서 약간의 접미사가 붙습니다. 쿠키는 다음과 같이 찾을 수 있습니다.

private static string FindCookieValueByName(HttpRequestBase request) 
{ 
    return request.Cookies 
     .Cast<string>() 
     .Where(cn => cn.StartsWith("__RequestVerificationToken", StringComparison.OrdinalIgnoreCase)) 
     .Select(cn => request.Cookies[cn].Value) 
     .FirstOrDefault(); 
}