我有一个单页应用程序(用户加载一堆HTML/JS,然后通过WebAPI进行AJAX请求,而不需要另一个MVC调用)。在WebAPI中我有以下内容:
public sealed class WebApiValidateAntiForgeryTokenAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(
System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException(nameof(actionContext));
}
if (actionContext.Request.Method.Method == "POST")
{
string requestUri = actionContext.Request.RequestUri.AbsoluteUri.ToLower();
if (uriExclusions.All(s => !requestUri.Contains(s, StringComparison.OrdinalIgnoreCase))) // place some exclusions here if needed
{
HttpRequestHeaders headers = actionContext.Request.Headers;
CookieState tokenCookie = headers
.GetCookies()
.Select(c => c[AntiForgeryConfig.CookieName]) // __RequestVerificationToken
.FirstOrDefault();
string tokenHeader = string.Empty;
if (headers.Contains("X-XSRF-Token"))
{
tokenHeader = headers.GetValues("X-XSRF-Token").FirstOrDefault();
}
AntiForgery.Validate(!string.IsNullOrEmpty(tokenCookie?.Value) ? tokenCookie.Value : null, tokenHeader);
}
}
base.OnActionExecuting(actionContext); // this is where it throws
}
}
在 Global.asax 中注册:
private static void RegisterWebApiFilters(HttpFilterCollection filters)
{
filters.Add(new WebApiValidateAntiForgeryTokenAttribute());
filters.Add(new AddCustomHeaderFilter());
}
我偶尔会在日志中看到“防伪cookie令牌和表单字段令牌不匹配”的错误。当发生这种情况时,tokenCookie.value
和 tokenHeader
都不为null。
在客户端,我所有的AJAX请求都使用以下内容:
beforeSend: function (request) {
request.setRequestHeader("X-XSRF-Token", $('input[name="__RequestVerificationToken"]').attr("value"););
},
使用 Razor 在我的 SPA 页面上生成令牌:
@Html.AntiForgeryToken()
我已经在Web.config中设置了我的机器密钥。
可能是什么原因导致这个问题?
更新 我刚刚检查了日志,有时会看到这个:
提供的防伪令牌是为用户“”,但当前用户是“someuser@domain.com”。 几秒钟前
当用户在登录的情况下刷新他们的SPA实例时就会发生这种情况。 SPA将他们降落到着陆页而不是内部页面,原因不明(User.Identity.IsAuthenticated
为true) - 然后他们无法登录,因为出现这个错误。 刷新后他们又回到了SPA内部。 不确定这意味着什么,但我认为提供更多信息并不会有坏处。
5.2.3
上。 - SB2055