2013-08-06 42 views

回答

3

我結束了創建與asp.net的MVC

這種類似的能力requestFilterAttibute是我的代碼完成迄今爲止:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false)] 
    public class ValidateHttpAntiForgeryToken : RequestFilterAttribute 
    { 
     public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto) 
     { 
      try 
      { 
       if (IsAjaxRequest(req)) 
        ValidateRequestHeader(req); 
       else 
        AntiForgery.Validate(); 

      } 
      catch (Exception ex) 
      { 
       res.StatusCode = 403; 
       res.StatusDescription = ex.Message; 
      } 
     } 

     private void ValidateRequestHeader(IHttpRequest req) 
     { 
      var cookie = req.Cookies.FirstOrDefault(c => c.Value.Name.Contains(AntiForgeryConfig.CookieName)); 
      if (cookie.Value == null) 
      { 
       throw new HttpAntiForgeryException(String.Format("Missing {0} cookie", AntiForgeryConfig.CookieName)); 
      } 
      IEnumerable<string> xXsrfHeaders = req.Headers.GetValues("__RequestVerificationToken"); 
      if (xXsrfHeaders == null || !xXsrfHeaders.Any()) 
       throw new HttpAntiForgeryException("Missing X-XSRF-Token HTTP header"); 
      AntiForgery.Validate(cookie.Value.Value, xXsrfHeaders.FirstOrDefault()); 

     } 

     private static bool IsAjaxRequest(IHttpRequest request) 
     { 
      IEnumerable<string> xRequestedWithHeaders = request.Headers.GetValues("X-Requested-With"); 
      if (xRequestedWithHeaders != null && xRequestedWithHeaders.Any()) 
      { 
       string headerValue = xRequestedWithHeaders.FirstOrDefault(); 
       if (!String.IsNullOrEmpty(headerValue)) 
       { 
        return String.Equals(headerValue, "XMLHttpRequest", StringComparison.OrdinalIgnoreCase); 
       } 
      } 
      return false; 
     } 
    } 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false)] 
    public class ValidateHttpAntiForgeryToken : RequestFilterAttribute 
    { 
     public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto) 
     { 
      try 
      { 
       if (IsAjaxRequest(req)) 
        ValidateRequestHeader(req); 
       else 
        AntiForgery.Validate(); 

      } 
      catch (Exception ex) 
      { 
       res.StatusCode = 403; 
       res.StatusDescription = ex.Message; 
      } 
     } 

     private void ValidateRequestHeader(IHttpRequest req) 
     { 
      var cookie = req.Cookies.FirstOrDefault(c => c.Value.Name.Contains(AntiForgeryConfig.CookieName)); 
      if (cookie.Value == null) 
      { 
       throw new HttpAntiForgeryException(String.Format("Missing {0} cookie", AntiForgeryConfig.CookieName)); 
      } 
      IEnumerable<string> xXsrfHeaders = req.Headers.GetValues("__RequestVerificationToken"); 
      if (xXsrfHeaders == null || !xXsrfHeaders.Any()) 
       throw new HttpAntiForgeryException("Missing X-XSRF-Token HTTP header"); 
      AntiForgery.Validate(cookie.Value.Value, xXsrfHeaders.FirstOrDefault()); 

     } 

     private static bool IsAjaxRequest(IHttpRequest request) 
     { 
      IEnumerable<string> xRequestedWithHeaders = request.Headers.GetValues("X-Requested-With"); 
      if (xRequestedWithHeaders != null && xRequestedWithHeaders.Any()) 
      { 
       string headerValue = xRequestedWithHeaders.FirstOrDefault(); 
       if (!String.IsNullOrEmpty(headerValue)) 
       { 
        return String.Equals(headerValue, "XMLHttpRequest", StringComparison.OrdinalIgnoreCase); 
       } 
      } 
      return false; 
     } 
    } 
3
+0

謝謝@Jon Canning我之前看到過這個代碼,但是我看不到我要如何再次實現Xsrf驗證的完整畫面一種服務方法? –

+1

我知道我可以使用@ Html.AntiForgeryToken()助手來生成令牌,現在我正在尋找一個文件管理器或一個file屬性來驗證請求,如http://kamranicus.com/Blog/Posts/70/protip-using-anti-forgery-token-with-aspnet-web-ap –

+0

實際上,這就是我所要求的:「我認爲解決方案可以創建自定義RequestFilterAttribute,還有其他想法?我只是要求其他選項 –

相關問題