Как получить вызов jQuery Ajax для публикации в Action, украшенный ValidateAntiForgeryToken - PullRequest
0 голосов
/ 03 июля 2018

В одном из моих контроллеров метод действия не выполняется, если я украсил его атрибутом [ValidateAntiForgeryToken].

Дополнительная информация : У меня есть код бритвы, чтобы сгенерировать токен, который я получил из скрытого поля. Я включил его в мой вызов jQuery Ajax (который передает модель и другое значение в действие контроллера (AccountController.Login). Он никогда не выполняет это действие. Что мне здесь не хватает?

Контроллер:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
     ...std MVC Identity Login code..
}

Разметка в представлении входа в систему (т. Е. Без тега) (который находится в модальном JQuery)

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
    {
        @Html.AntiForgeryToken()
    }
    <div>...login markup</div>
    <script type="text/javascript">
        $(document).ready(function ()
        {
            $("#btnSubmit").on("click", function ()
            {
                var modeldata = { Email: $('#txtUserEmail').val(), Password: $('#txtPwd').val() };
                var returnUrl = null;

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

                alert(token);
                $.ajax({
                    url: "/Account/Login",
                    type: "POST",
                    data: { __RequestVerificationToken: token, model: modeldata, returnUrl: returnUrl },
                    async: false,
                    dataType: 'JSON', //do not use JSON , because the server is expecting the __RequestVerificationToken parameter to be part of the POST request payload
                    contentType: 'application/x-www-form-urlencoded; charset=utf-8',

                    success: function (ViewResult)
                    {
                        if (ViewResult === "0")
                        {
                            window.location.href='@Url.Action("Index","Home")'
                        }
                        else
                        {
                            $('#dialogL').replaceWith(ViewResult);
                        }
                    }
                });
            });
        });
    </script>
...