【发布时间】:2017-12-28 11:33:27
【问题描述】:
尝试在核心 mvc 项目中打开防伪,但没有成功。做了什么:
添加过滤器以在每个 POST 请求上自动检查防伪令牌。
services.AddMvc(o =>
{
o.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
以这种方式将令牌生成添加到每个页面。
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Antiforgery;
@{
var antiforgeryRequestToken = Antiforgery.GetAndStoreTokens(Context).RequestToken;
}
...
...
<script>
var antiforgeryToken = @Json.Serialize(antiforgeryRequestToken);
</script>
最后每个客户端ajax请求都以这种方式添加RequestVerificationToken。
var options = {
url: o.url, type: 'POST', data: o.params, headers: { 'RequestVerificationToken': antiforgeryToken } };
我可以看到每个 ajax 请求都有令牌,但对于任何 POST 请求,我总是得到 400。如果我禁用过滤器,它工作正常。但是一旦我启用它,asp.net core 就会开始对每个 POST 请求进行验证,它总是返回 400。
有什么想法吗?
更新:
我已按照我在 cmets 中获得的说明进行操作,现在代码如下所示。 ConfigureServices 方法:
services.AddMvc(o => {
o.Filters.Add(new HandleAllExceptionsFilterFactory());
o.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
services.AddAntiforgery(o => o.CookieName = "XSRF-TOKEN");
这里是注册的中间件:
app.Use(next => context => {
if (context.Request.Path == "/")
{
var antiforgery = app.ApplicationServices.GetService<IAntiforgery>();
var token = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", token.RequestToken, new CookieOptions {HttpOnly = false});
}
return next(context);
});
我还删除了之前发送标头的所有客户端 JavaScript 代码。但是还是不行。
【问题讨论】:
-
应该是
data: { __RequestVerificationToken: antiforgeryToken } -
你的意思是标题名称必须从
RequestVerificationToken改为__RequestVerificationToken? -
不仅,令牌应该在
data。试试看是否可行。 -
我还需要更改标题名称吗?
-
是的,改成
__RequestVerificationToken
标签: asp.net asp.net-mvc asp.net-core antiforgerytoken