asp.net - requestverificationtoken - validateantiforgerytoken vue




incluem antiforgerytoken em ajax post ASP.NET MVC (7)

é 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 para o servidor desta página em particular tem um sinal 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 para obter seu valor use os códigos abaixo:

<script type="text/javascript">
    function gettoken() {
        var token = '@Html.AntiForgeryToken()';
        token = $(token).val();
        return token;
   }
</script>

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 o passo 2 apenas decore seu método de ação por [ValidateAntiForgeryToken]

Estou tendo problemas com o AntiForgeryToken com ajax. Eu estou usando o asp.net MVC 3. Eu tentei a solução em chamadas jQuery Ajax eo 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:

<form id="__AjaxAntiForgeryForm" action="#" method="post">
    @Html.AntiForgeryToken()
</form>

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 de 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()
}

<!-- this could be a button -->
<a href="#" id="ajaxSubmit">Submit</a>

<script type="text/javascript">
    $('#ajaxSubmit').click(function () {

        $('#__AjaxAntiForgeryForm').submit();

        return false;
    });
</script>

No Asp.Net Core, você pode solicitar o token diretamente, conforme documentado :

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf    
@functions{
    public string GetAntiXsrfRequestToken()
    {
        return Xsrf.GetAndStoreTokens(Context).RequestToken;
    }
}

E usá-lo em javascript:

function DoSomething(id) {
    $.post("/something/todo/"+id,
               { "__RequestVerificationToken": '@GetAntiXsrfRequestToken()' });
}

Você pode adicionar o filtro global recomendado, conforme documentado :

services.AddMvc(options =>
{
    options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
})

No Asp.Net MVC, quando você usa @Html.AntiForgeryToken() Razor cria um campo de entrada oculto com o nome __RequestVerificationToken para armazenar tokens. Se você quer escrever uma implementação AJAX, você deve 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


Sinta-se livre para usar a função abaixo:

function AjaxPostWithAntiForgeryToken(destinationUrl, successCallback) {
var token = $('input[name="__RequestVerificationToken"]').val();
var headers = {};
headers["__RequestVerificationToken"] = token;
$.ajax({
    type: "POST",
    url: destinationUrl,
    data: { __RequestVerificationToken: token }, // Your other data will go here
    dataType: "json",
    success: function (response) {
        successCallback(response);
    },
    error: function (xhr, status, error) {
       // handle failure
    }
});

}


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()
}

<div id="myDiv" data-url="@Url.Action("Index", "Home")">
    Click me to send an AJAX request to a controller action
    decorated with the [ValidateAntiForgeryToken] attribute
</div>

<script type="text/javascript">
    $('#myDiv').submit(function () {
        var form = $('#__AjaxAntiForgeryForm');
        var token = $('input[name="__RequestVerificationToken"]', form).val();
        $.ajax({
            url: $(this).data('url'),
            type: 'POST',
            data: { 
                __RequestVerificationToken: token, 
                someValue: 'some value' 
            },
            success: function (result) {
                alert(result.someValue);
            }
        });
        return false;
    });
</script>

        function DeletePersonel(id) {

                var data = new FormData();
                data.append("__RequestVerificationToken", "@HtmlHelper.GetAntiForgeryToken()");

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

                    }
                });

        }
    

        public static class 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;
                }
                return "";
            }
        }






csrf