Многократная отправка формы AJAX через токен AntiForgery - PullRequest
2 голосов
/ 19 декабря 2011

Я использовал 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 пользователь добавляет контакт phone и нажимает ввод (ajax) запрос завершается нормально, но снова в той же форме пользователь выбирает электронную почту и нажимает ввод здесья получаю сообщение об ошибке, потому что AntiforgeryToken - это то же самое, что было сгенерировано ранее. Мой вопрос: как я могу обновить AntiForgeryToken на ajax success

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Я не уверен, что это решение, но оно кажется стабильным:

Предотвращение CSRF с помощью Ajax

0 голосов
/ 15 марта 2016

Вы можете сгенерировать собственный токен 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...