incluem antiforgerytoken em ajax post ASP.NET MVC

Estou tendo problemas com o AntiForgeryToken com ajax. Estou usando a ASP.NET MVC 3. Eu tentei a solução em chamadas do jQuery Ajax e o Html.AntiForgeryToken () . Usando essa solução, o token agora está sendo passado:

var data = { ... } // with token, key is '__RequestVerificationToken' $.ajax({ type: "POST", data: data, datatype: "json", traditional: true, contentType: "application/json; charset=utf-8", url: myURL, success: function (response) { ... }, error: function (response) { ... } }); 

Quando eu removo o atributo [ValidateAntiForgeryToken] apenas para ver se os dados (com o token) estão sendo passados ​​como parâmetros para o controlador, posso ver que eles estão sendo passados. Mas, por algum motivo, o A required anti-forgery token was not supplied or was invalid. mensagem ainda aparece quando eu coloco o atributo de volta.

Alguma ideia?

EDITAR

O antiforgerytoken está sendo gerado dentro de um formulário, mas não estou usando uma ação de envio para enviá-lo. Em vez disso, estou apenas começando o valor do token usando jquery e, em seguida, tentando ajax postar isso.

Aqui está o formulário que contém o token e está localizado na página mestra superior:

  @Html.AntiForgeryToken()  

Você especificou incorretamente o contentType para application/json .

Aqui está um exemplo de como isso pode funcionar.

Controlador:

 public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Index(string someValue) { return Json(new { someValue = someValue }); } } 

Visão:

 @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" })) { @Html.AntiForgeryToken() } 
Click me to send an AJAX request to a controller action decorated with the [ValidateAntiForgeryToken] attribute

Outra abordagem (menos javascript), que eu fiz, é algo assim:

Primeiro, um ajudante de html

 public static MvcHtmlString AntiForgeryTokenForAjaxPost(this HtmlHelper helper) { var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); // Above gets the following:  var removedStart = antiForgeryInputTag.Replace(@"", ""); if (antiForgeryInputTag == removedStart || removedStart == tokenValue) throw new InvalidOperationException("Oops! The Html.AntiForgeryToken() method seems to return something I did not expect."); return new MvcHtmlString(string.Format(@"{0}:""{1}""", "__RequestVerificationToken", tokenValue)); } 

que retornará uma string

 __RequestVerificationToken:"P5g2D8vRyE3aBn7qQKfVVVAsQc853s-naENvpUAPZLipuw0pa_ffBf9cINzFgIRPwsf7Ykjt46ttJy5ox5r3mzpqvmgNYdnKc1125jphQV0NnM5nGFtcXXqoY3RpusTH_WcHPzH4S4l1PmB8Uu7ubZBftqFdxCLC5n-xT0fHcAY1" 

para que possamos usá-lo assim

 $(function () { $("#submit-list").click(function () { $.ajax({ url: '@Url.Action("SortDataSourceLibraries")', data: { items: $(".sortable").sortable('toArray'), @Html.AntiForgeryTokenForAjaxPost() }, type: 'post', traditional: true }); }); }); 

E parece que funciona!

é tão simples! quando você usa @Html.AntiForgeryToken() no seu código html, significa que o servidor assinou esta página e cada solicitação enviada ao servidor desta página em particular tem um sinal que é impedido de enviar uma solicitação falsa por hackers. Portanto, para que esta página seja autenticada pelo servidor, você deve seguir duas etapas:

1.Envie um parâmetro chamado __RequestVerificationToken e obtenha seus códigos de uso de valor abaixo:

  

por exemplo, faça uma chamada ajax

 $.ajax({ type: "POST", url: "/Account/Login", data: { __RequestVerificationToken: gettoken(), uname: uname, pass: pass }, dataType: 'json', contentType: 'application/x-www-form-urlencoded; charset=utf-8', success: successFu, }); 

e passo 2 apenas decore seu método de ação por [ValidateAntiForgeryToken]



         function DeletePersonel (id) {

                 var data = novo FormData ();
                 data.append ("__ RequestVerificationToken", "@ HtmlHelper.GetAntiForgeryToken ()");

                 $ .ajax ({
                     tipo: 'POST',
                     url: '/ Personel / Delete /' + id,
                     dados: dados,
                     cache: falso,
                     processData: false,
                     contentType: false,
                     success: function (result) {

                     }
                 });

         }
    

         class estática pública HtmlHelper
         {
             public static string GetAntiForgeryToken ()
             {
                 System.Text.RegularExpressions.Match value = System.Text.RegularExpressions.Regex.Match (System.Web.Helpers.AntiForgery.GetHtml (). ToString (), "(?: Value = \") (. *) (? : \ ")");
                 if (value.Success)
                 {
                     return value.Groups [1] .Value;
                 }
                 Retorna "";
             }
         }

Eu sei que esta é uma questão antiga. Mas vou adicionar minha resposta de qualquer maneira, pode ajudar alguém como eu.

Se você não quiser processar o resultado da ação de postagem do controlador, como chamar o método LoggOff do controlador Accounts , você pode fazer como a seguinte versão da resposta do @DarinDimitrov:

 @using (Html.BeginForm("LoggOff", "Accounts", FormMethod.Post, new { id = "__AjaxAntiForgeryForm" })) { @Html.AntiForgeryToken() }  Submit  

Eu tentei muitos trabalhos e nenhum deles funcionou para mim. A exceção foi “O campo obrigatório do formulário anti-falsificação” __RequestVerificationToken “.

O que me ajudou foi mudar de forma .ajax para .post:

 $.post( url, $(formId).serialize(), function (data) { $(formId).html(data); }); 

No Asp.Net MVC, quando você usa @Html.AntiForgeryToken() Razor cria um campo de input oculto com o nome __RequestVerificationToken para armazenar tokens. Se você quer escrever uma implementação AJAX você tem que buscar este token e passá-lo como um parâmetro para o servidor para que ele possa ser validado.

Etapa 1: obter o token

 var token = $('input[name="`__RequestVerificationToken`"]').val(); 

Etapa 2: passar o token na chamada AJAX

 function registerStudent() { var student = { "FirstName": $('#fName').val(), "LastName": $('#lName').val(), "Email": $('#email').val(), "Phone": $('#phone').val(), }; $.ajax({ url: '/Student/RegisterStudent', type: 'POST', data: { __RequestVerificationToken:token, student: student, }, dataType: 'JSON', contentType:'application/x-www-form-urlencoded; charset=utf-8', success: function (response) { if (response.result == "Success") { alert('Student Registered Succesfully!') } }, error: function (x,h,r) { alert('Something went wrong') } }) }; 

Nota : O tipo de conteúdo deve ser 'application/x-www-form-urlencoded; charset=utf-8' 'application/x-www-form-urlencoded; charset=utf-8'

Eu fiz o upload do projeto no Github; você pode baixar e experimentar.

https://github.com/lambda2016/AjaxValidateAntiForgeryToken