2016-08-16 25 views
0

我正嘗試在單頁應用程序上使用.Net Framework中的AntiForgeryToken實現CSRF。我實現了我的.csthml文件裏面的一些代碼,我已經創建了一個AuthorizeAttribute:單頁使用Web Api 2後端的CSRF後端

Index.cshtml

<script> 

    @functions{ 
     public string GetAntiForgeryToken() 
     { 
      string cookieToken, formToken; 
      System.Web.Helpers.AntiForgery.GetTokens(null, out cookieToken, out formToken); 
      return cookieToken + ":" + formToken;     
     } 
    } 

    $.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
     var xxx = '@GetAntiForgeryToken()'; 
     jqXHR.setRequestHeader("X-CSRF", xxx); 
    }); 

</script> 

ValidateHttpAntiForgeryTokenAttribute.cs

public class ValidateHttpAntiForgeryTokenAttribute : AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     var headers = actionContext.Request.Headers; 

     var headerToken = headers.Contains("X-CSRF") ? headers.GetValues("X-CSRF").FirstOrDefault() : null; 

     if (headerToken == null) 
     { 
      return false; 
     } 

     var tokenValues = headerToken.Split(':'); 

     if (tokenValues.Length < 2) 
     { 
      return false; 
     } 
     else 
     { 
      var cookieToken = tokenValues[0]; 
      var formToken = tokenValues[1]; 
      try 
      { 
       AntiForgery.Validate(cookieToken, formToken); 
      } 
      catch(Exception ex) 
      { 
       return false; 
      } 
     }   
     return base.IsAuthorized(actionContext); 
    } 
}   

myController的。 cs

[HttpGet] 
    [ValidateHttpAntiForgeryTokenAttribute] 
    public HttpResponseMessage Get() 
    { 
    ... 
    } 

每一次ValidateHttpAntiForgeryTokenAttribute被調用時,我得到了以下錯誤:

The provided anti-forgery token was meant for user "CMP\usr", but the current user is "[email protected]" 

我想知道爲什麼它會顯示計算機的用戶名,而不是用戶名是登錄應用程序,爲什麼令牌ISN」 t改變時,請致電GetAntiForgeryToken()執行。

提前致謝。

+0

[Microsoft已經提供了AntiForgery Token驗證的實現](https://msdn.microsoft.com/en-us/library/system.web.mvc.validateantiforgerytokenattribute(v = vs.118).aspx) –

回答

0

由於快速修復(如果你不關心反CSRF邏輯中的用戶名驗證)將是:

AntiForgeryConfig.SuppressIdentityHeuristicChecks = true 

在AppStart的邏輯(Global.asax中)的地方。

+0

仍然是同樣的問題 – placplacboom

+0

'AntiForgeryConfig'不爲我提供'SuppressIdentityHeuristicChecks' – DevEng