我正嘗試在單頁應用程序上使用.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()執行。
提前致謝。
[Microsoft已經提供了AntiForgery Token驗證的實現](https://msdn.microsoft.com/en-us/library/system.web.mvc.validateantiforgerytokenattribute(v = vs.118).aspx) –