在SPA应用程序中正确使用ASP.NET 5中的AntiForgery令牌
本文关键字:NET ASP 中的 令牌 AntiForgery 应用程序 SPA | 更新日期: 2023-09-27 18:27:13
在SPA应用程序的早期版本的ASP.NET中,AntiForgey令牌的想法如下:
- 在页面上添加
@Html.AntiForgeryToken();
- 将
__RequestVerificationToken
添加到请求中 - ovverride AuthorizeAttribute为
ValidateJsonAntiForgeryTokenAttribute
我并不真正理解ASP.NET 5中的授权要求(是否有一些好的信息源?),但看起来新的行为应该是这样的:
- 添加
asp-anti-forgerytaghelper
- 将
__RequestVerificationToken
添加到请求中 - 这应该是新的要求
问题是:如何编写新的授权要求并删除标准的授权要求?有人能给我一些建议或举个例子吗?感谢
对于MVC6,如果您使用这样的东西:
<form asp-controller="Account"
asp-action="Login">
</form>
您将自动获得:
<form action="/Account/Login" method="post">
<input name="__RequestVerificationToken" type="hidden" value="....">
</form>
只有当您想停用该行为时,才会使用asp-antiforgery
。
至于验证本身,它是在ConfigureServices
和Configure
方法中执行app.AddMvc(...)
时添加的。
事实上,有一堆东西正在被添加,如果你很好奇,你可以查看代码!
如果你真的要使用ajax从Action生成这个,那么你可以有一个依赖于IHtmlGenerator
的控制器,并以这种方式生成你的令牌。
在AspNetCore 1.1.0.0(可能也在早期版本中)的SPA场景中,这实际上很容易:
确保您从.cs.html视图交付索引页面,然后只添加
@Html.AntiForgeryToken()
如果您使用的是jquery,那么您可以读取此令牌,并确保它与http标头中所有未来的非获取请求一起发送
$(document).ajaxSend(function(e, xhr, options) {
if (options.type.toUpperCase() != "GET") {
xhr.setRequestHeader("RequestVerificationToken", $("input[name='__RequestVerificationToken']").val());
}
});
在控制器方法中,只需添加
[HttpPost]
[ValidateAntiForgeryToken]
public string TestAntiForgery()
{
return "success";
}
如果你想/必须使用差异标头,你可以在configureServices:中这样更改它
services.Configure<AntiforgeryOptions>((options) =>
{
// Configure a different header here
options.HeaderName = "otherHeaderName";
});