【问题标题】:ASP.NET MVC anti-forgery token (CSRF) not workingASP.NET MVC 防伪令牌 (CSRF) 不起作用
【发布时间】:2019-06-09 08:54:19
【问题描述】:

我正在尝试将 CSRF 令牌实施到我的代码中,但到目前为止没有运气。我想有三个步骤:

我要发送表单的代码:

@using (Html.BeginForm("Manage", "Account"))
{
    @Html.AntiForgeryToken()
}

在我的控制器视图中我写了:

public class HomeController : Controller
    {
    [HttpPost]
    [ValidateAntiForgeryToken] 

public ActionResult Index()
    {

        return View("Table");
    } 
    etc...
    }

还有我的 ajax 调用:

$.ajax({
            type: "POST",
            url: "../Home/" + sFunction,
            contentType: "application/json; charset=utf-8",
            processData: false,
            dataType: "json",
            headers: { "__RequestVerificationToken": 
            $('input[name=__RequestVerificationToken]').val() },
            data: data === null ? null : JSON.stringify(data),

等等

我错过了什么?为什么它不工作? 谢谢

【问题讨论】:

  • 嗨乔,请点击以下链接stackoverflow.com/questions/4074199/…
  • 谢谢,我已经检查了该链接以及其他链接。我没有设法解决我的问题
  • 我认为您的 Ajax POST 调用是通过单击按钮显式启动的,请确认
  • 不,Ajax 调用在页面加载时自动发生。它可以在没有防伪令牌的情况下工作。谢谢
  • @JoeJoeJoe '[ValidateAntiForgeryToken] ' 需要装饰您的表单发布方法。不是您的索引 GET 方法

标签: asp.net model-view-controller csrf antiforgerytoken


【解决方案1】:

[ValidateAntiForgeryToken] 需要修饰你的表单发布方法。不是您的索引 GET 方法。这种情况下……

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Manage(YourViewModel model)
{
    //do your logic

    return View(//whatever route & model)
}

然后在你的 js 中将它添加到你的数据对象中。

let form = //get your form control here
let data = $(form).serialize();//form is your form control
data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();

$.ajax({
        type: "POST",
        url: //controller/action,
        contentType: "application/x-www-form-urlencoded",
        processData: false,
        dataType: "json",
        data: JSON.stringify(data),
        //etc....
});

【讨论】:

  • 谢谢!表单发布方法应该为空吗? (public ActionResult Manage())
  • 不,您需要在其中弹出表单视图模型,然后执行逻辑。我已经更新了我的答案@JoeJoeJoe
  • 我已经阅读了超过半打关于防伪令牌的教程,他们只是说在控制器中扑通一声 [ValidateAntiForgeryToken] 并且它会起作用,没有人解释需要某种逻辑里面。 ValidateAntiForgeryToken 检查传入请求是否具有请求验证 cookie 和隐藏的请求验证表单字段。这是我需要在里面写的逻辑吗?我希望有什么东西可以在某处解释这一点
  • @JoeJoeJoe AntiForgeryTokens 仅适用于 POST 请求。将它们与GET 一起使用是多余的。 GETs 从服务器检索数据。 POST 向服务器发送数据。 AFT 基本上确保传入服务器的数据来自有效来源。至于逻辑,我指的是您自己需要编写来处理表单的任何逻辑......例如,映射并提交到数据库
  • 感谢您的解释,我现在明白了。似乎还有其他问题,即使我已指定它应该作为 Json 发送,但当我在控制器中输入断点时,它似乎没有出现。我认为如果没有指定内容类型,它默认将其作为表单发送,我认为这就是它正在做的事情。将不得不更深入地研究它。
猜你喜欢
  • 2015-03-12
  • 2014-04-26
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2015-05-07
相关资源
最近更新 更多