【问题标题】:Correct usage of AntiForgery token in ASP.NET 5 in SPA application?在 SPA 应用程序中正确使用 ASP.NET 5 中的 AntiForgery 令牌?
【发布时间】:2016-03-22 21:14:51
【问题描述】:

在以前版本的 ASP.NET 中,在应用 SPA 期间,AntiForgey 令牌的想法如下:

  • 在页面添加@Html.AntiForgeryToken();
  • 在请求中添加__RequestVerificationToken
  • ovverride AuthorizeAttribute as ValidateJsonAntiForgeryTokenAttribute

我不太了解 ASP.NET 5 中的授权要求(是否有一些好的信息来源?),但看起来新的行为应该是这样的:

  • 添加asp-anti-forgerytaghelper
  • 在请求中添加__RequestVerificationToken
  • 这里应该是新要求。

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

【问题讨论】:

标签: c# asp.net-core single-page-application antiforgerytoken


【解决方案1】:

在带有 SPA 场景的 AspNetCore 1.1.0.0(可能也在早期版本中)中,这实际上非常简单:

确保从 .cshtml 视图交付索引页面并添加

@Html.AntiForgeryToken()

如果您使用的是 jquery,则可以读取此令牌并确保将其与 http-header 中的所有未来非获取请求一起发送

$(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";
});

【讨论】:

    【解决方案2】:

    对于 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(...) 时添加的。

    其实还有很多东西正在添加中,如果你好奇,可以check out the code

    如果您真的要使用 从 Action 生成它,那么您可以拥有一个依赖于 IHtmlGenerator 的控制器并以这种方式生成您的令牌。

    【讨论】:

    • 对不起,如果我不清楚。我同意这一点,但它只适用于你提到的 MVC6。我问的是SPA。例如,我应该如何处理由 Angular 发送的__RequestVerificationToken,而不是作为表单提交。
    • 更新了答案。基本上,它是从IHtmlGenerator 生成的,它依赖于IAntiForgery,它依赖于完全不同类型的疯狂依赖。如果您需要确保它存在,那就是这样做的方法。或者你可以把它关掉。
    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2015-03-20
    • 2018-07-03
    相关资源
    最近更新 更多