Ошибка ValidateAntiForgeryToken при отправке формы ajax jQuery

StackOverflow https://stackoverflow.com/questions/2067901

  •  20-09-2019
  •  | 
  •  

Вопрос

У меня есть форма HTML, в которую я динамически добавляю текстовое поле и выполняю запрос POST для этой формы через jQuery к контроллеру ASP.NET MVC.

Если я вызываю запрос POST без атрибута ValidateAntiForgeryToken в действии контроллера, он работает нормально.Но когда я добавляю атрибут ValidateAntiForgeryToken к действию, я получаю следующее исключение:

«Необходимый токен защиты от подделки не был предоставлен или был недействителен».

Есть ли у кого-нибудь идеи относительно того, почему это может быть?

Следует отметить, что идентификатор токена в файле cookie совершенно отличается от токена, отображаемого в форме.Почему они могут быть разными?

Действие:

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public string MyAction(Guid id, Dto dto)
{            
  //return JSON;
}  

Форма (как отображается):

<form id="slider" class="fc" method="post" action="/controller/myaction/" name="tabEdit">
  <span id="slider_previous" class="sprite" tabindex="0" title="foo">Previous</span>
  <input type="hidden" value="mzyg7UWQrHwafoSuoJBvwfraQEtCTAmM9QHYeyMSrAHFHG10BNXM+I2yNgz8zQ8yu/E43eF3yMuHX7YIQwmK3Q==" name="__RequestVerificationToken"/>
  <div id="sliderWrap" style="width: 31.243%;">
    <ul class="sliderList">
      <li id="ID_3d031daf-a7f9-46f2-b4b9-7c9fc6560e3d">
      </li>
      <li id="ID_78b61634-d88a-4f33-8e48-e0655ad8a958" class="current">
        <input class="sliderInput" type="text" value="" name="Bar"/>
        <a class="sprite" href="/a/b/78b61634-d88a-4f33-8e48-e0655ad8a958">Delete</a>
      </li>
    </ul>
  </div>
<span id="slider_addNew" class="sprite" tabindex="0" title="Add new">New</span>
<span id="slider_next" class="sprite" tabindex="0" title="See next">Next</span>
</form>

Исходное представление, отображающее токен защиты от подделки:

<form id="slider" class="fc" method="post" action="/controller/myaction/" name="tabEdit">
<%=Html.AntiForgeryToken(OurNamespace.MVC.Constants.SaltValue) %>
  <ul class="noJs">
<!-- etc -->       
  </ul>
</form>
Это было полезно?

Решение

Вы указываете пользовательскую соль при создании AntiForgeryToken, вам также необходимо предоставить эту соль для атрибута ValidateAntiForgeryToken.

[ValidateAntiForgeryToken(Salt=OurNamespace.MVC.Constants.SaltValue)]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top