【问题标题】:Multiple AJAX form submission through AntiForgery Token通过 AntiForgery Token 提交多个 AJAX 表单
【发布时间】:2011-12-19 07:37:14
【问题描述】:

我使用AntiForgeryToken处理多个表单提交,代码如下

   public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var ctx = filterContext.HttpContext;
        var response = filterContext.HttpContext.Response;

        var request = filterContext.HttpContext.Request;
       string _antiForgToken =  request.Form.GetValues("__RequestVerificationToken")[0];
       if (ctx.Session["userform"] != null)
       {
           if (_antiForgToken.Equals(ctx.Session["userform"].ToString()))
           {
               //kill the request                   
               response.StatusCode = 400;
               response.StatusDescription = "Bad Request.";                   
           }
       }
       else
           ctx.Session["userform"] = _antiForgToken;

    }

代码在(普通)表单上运行良好,但当表单通过 ajax 多次发布时会出现问题(这是必需的功能)我有一个表单,例如 Add Contacts 用户添加联系人 @987654324 @ 并按回车键(ajax)请求正常完成,但再次以相同的形式用户选择电子邮件并在此处按回车我收到错误,因为AntiforgeryToken 与之前生成的相同,我的问题是如何刷新AntiForgeryToken ajax 成功

【问题讨论】:

标签: jquery asp.net ajax asp.net-mvc forms


【解决方案1】:

我不确定这是否是解决方案,但它似乎很稳定:

Preventing CSRF With Ajax

【讨论】:

  • 我已经阅读了这篇文章,但它似乎解决了 json 发布问题...
【解决方案2】:

您可以通过在 razor 视图中调用以下函数来生成自定义 AntiForgery 令牌。

@functions{
  public string GetAntiForgeryToken()
  {
    string cookieToken, formToken;
    System.Web.Helpers.AntiForgery.GetTokens(null, out cookieToken, out formToken);
    return cookieToken + ":" + formToken;
  }
}
<script>
$.ajax({
  type: "POST",
  url: 'xxx',
  data: data,
  headers: { '__RequestVerificationToken': GetAntiForgeryToken()},
  success: function (data) {
    //if success
  },
  error: function (e) {
    //if error
  }
});
</script>

现在在您的属性过滤器中,您可以使用以下代码对其进行验证:

string tokenValue = request.Headers["__RequestVerificationToken"];
if (!String.IsNullOrEmpty(tokenValue))
{
    string[] tokens = tokenValue.Split(':');
    if (tokens.Length == 2)
    {
      cookieToken = tokens[0].Trim();
      formToken = tokens[1].Trim();
    }
}
System.Web.Helpers.AntiForgery.Validate(cookieToken, formToken);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多