【发布时间】:2016-08-16 23:32:13
【问题描述】:
我正在尝试在单页应用程序上使用 .Net Framework 中的 AntiForgeryToken 实现 CSRF。我在 .csthml 文件中实现了一些代码,并创建了 AuthorizeAttribute:
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 "dev@company.net"
我想知道为什么它显示计算机的用户名而不是登录应用程序的用户名,以及为什么执行调用 GetAntiForgeryToken() 时令牌没有改变。
提前致谢。
【问题讨论】:
-
Microsoft 实现仅适用于 HTML 表单请求。这里的问题是关于验证 XHR 请求。
标签: c# antiforgerytoken