gpt4 book ai didi

ASP.NET Core MVC防伪

转载 作者:行者123 更新时间:2023-12-02 11:09:12 25 4
gpt4 key购买 nike

尝试在核心 mvc 项目中打开防伪功能,但没有成功。做了什么:

添加过滤器以自动检查每个 POST 请求的防伪 token 。

services.AddMvc(o =>
{
o.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});

token 生成以这种方式添加到每个页面。

@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请求都有 token ,但对于任何POST请求我总是得到400。如果我禁用过滤器,它就可以正常工作。但是一旦我启用它,asp.net core 就会开始对每个 POST 请求进行验证,并且总是返回 400。

有什么想法吗?

更新:

我已按照评论中的说明进行操作,现在代码如下所示。配置服务方法:

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);
});

我还删除了之前发送 header 的所有客户端 JavaScript 代码。但还是不行。

最佳答案

你已经很接近了,它比你想象的要简单得多。

首先,当您使用 services.AddMvc(); 时已经添加了防伪功能。不需要添加任何过滤器,因此删除它们。

然后您需要更改防伪配置。

// Old
services.AddAntiforgery(o => o.CookieName = "XSRF-TOKEN");
// New
services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");

仅当您使用 ajax 时才需要此操作。默认情况下,防伪系统仅考虑表单数据。

接下来,在您看来,您可以使用 @Html.AntiForgeryToken() 轻松生成防伪 token 。 。不需要所有额外的代码。你可以摆脱它。这将创建一个隐藏的 <input />与代币的值(value)。如果您使用 <form />如果您使用标签助手,例如asp-action,则会自动为您创建此内容和asp-controller 。如果您不使用那些可以使用的标签助手,则使用 asp-antiforgery="true" .

现在你的ajax请求可以消耗隐藏的<input />值(value)。这是一个例子:

$.ajax({
method: "POST",
url: "/api/test",
data: data,
beforeSend: function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
statusCode: {
200: function () {
alert("Success");
},
400: function () {
alert("Client error");
},
500: function () {
alert("Server error");
}
}
});

重要的部分是beforeSend功能。您可以在此处将请求 header 设置为与 Startup.cs 中的设置相同的 header 名称。

现在您需要做的就是添加 [ValidateAntiForgeryToken]到你想要的方法。

最后,在测试之前,请务必删除您添加的中间件。

这只是一种方法。官方文档here找到了很多其他解决方案.

关于ASP.NET Core MVC防伪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45254196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com