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