在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添加到请求中
  • 这应该是新的要求

问题是:如何编写新的授权要求并删除标准的授权要求?有人能给我一些建议或举个例子吗?感谢

在SPA应用程序中正确使用ASP.NET 5中的AntiForgery令牌

对于MVC6,如果您使用这样的东西:

<form asp-controller="Account" 
      asp-action="Login">
</form>

您将自动获得:

<form action="/Account/Login" method="post">
    <input name="__RequestVerificationToken" type="hidden" value="....">
</form>

只有当您想停用该行为时,才会使用asp-antiforgery

至于验证本身,它是在ConfigureServicesConfigure方法中执行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";
});