У меня проблемы с AntiForgeryToken с ajax. Я использую ASP.NET MVC 3. Я пробовал решение в вызовах jQuery Ajax и Html.AntiForgeryToken () . Используя это решение, токен теперь передается:
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) {
...
}
});
Когда я удаляю [ValidateAntiForgeryToken]
атрибут, чтобы посмотреть, передаются ли данные (с токеном) в качестве параметров контроллеру, я вижу, что они передаются. Но по какой-то причине A required anti-forgery token was not supplied or was invalid.
сообщение все равно всплывает, когда я возвращаю атрибут.
Любые идеи?
РЕДАКТИРОВАТЬ
Antiforgerytoken создается внутри формы, но я не использую действие отправки для его отправки. Вместо этого я просто получаю значение токена с помощью jquery, а затем пытаюсь опубликовать это в ajax.
Вот форма, которая содержит токен и находится на верхней главной странице:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
источник
contentType
чтобы ,application/json
потому что сервер ожидает , что__RequestVerificationToken
параметр , чтобы быть частью полезной нагрузки запроса POST с использованиемapplication/x-www-form-urlencoded
.$(this).data('url'),
может понять, что будет URL моего контроллера и действия. пожалуйста, объясни. спасибоДругой (менее javascriptish) подход, который я использовал, выглядит примерно так:
Во-первых, Html помощник
это вернет строку
так что мы можем использовать это так
И это похоже на работу!
источник
@Html.AntiForgeryTokenForAjaxPost
на две части, чтобы получить имя токена в одной руке и его значение в другой. Иначе подсветка синтаксиса все испортила. Это заканчивается так (убрал одинарные кавычки из возвращаемого результата, так что он ведет себя как любой помощник MVC, например, @Url):'@Html.AntiForgeryTokenName' : '@Html.AntiForgeryTokenValue'
XElement.Parse(antiForgeryInputTag).Attribute("value").Value
var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); return XElement.Parse(antiForgeryInputTag).Attribute("value").Value
это так просто! когда вы используете
@Html.AntiForgeryToken()
в своем html-коде, это означает, что сервер подписал эту страницу, и каждый запрос, отправляемый на сервер с этой конкретной страницы, имеет знак, запрещающий хакерам посылать поддельный запрос. поэтому для аутентификации этой страницы сервером вы должны выполнить два шага:1. отправить параметр с именем
__RequestVerificationToken
и получить его значения используйте коды ниже:например взять вызов AJAX
и шаг 2 просто украсить ваш метод действия
[ValidateAntiForgeryToken]
источник
В Asp.Net Core вы можете запросить токен напрямую, как описано в документации :
И используйте это в JavaScript:
Вы можете добавить рекомендуемый глобальный фильтр, как описано в документации :
Обновить
Вышеупомянутое решение работает в сценариях, которые являются частью .cshtml. Если это не так, то вы не можете использовать это напрямую. Мое решение состояло в том, чтобы сначала использовать скрытое поле для хранения значения.
Мой обходной путь, все еще использующий
GetAntiXsrfRequestToken
:Когда нет формы:
name
Атрибут может быть опущен , так как я используюid
атрибут.Каждая форма включает этот токен. Таким образом, вместо добавления еще одной копии того же токена в скрытое поле, вы также можете искать существующее поле с помощью
name
. Обратите внимание: внутри документа может быть несколько форм, поэтомуname
в этом случае он не уникален. В отличие отid
атрибута, который должен быть уникальным.В скрипте найдите по id:
Альтернативой, без ссылки на токен, является отправка формы со скриптом.
Образец формы:
Токен автоматически добавляется в форму как скрытое поле:
И отправьте в сценарий:
Или используя метод сообщения:
источник
В Asp.Net MVC при использовании
@Html.AntiForgeryToken()
Razor создается скрытое поле ввода с именем__RequestVerificationToken
для хранения токенов. Если вы хотите написать реализацию AJAX, вы должны сами извлечь этот токен и передать его в качестве параметра на сервер, чтобы его можно было проверить.Шаг 1: Получить токен
Шаг 2: Передайте токен в вызове AJAX
Примечание : тип контента должен быть
'application/x-www-form-urlencoded; charset=utf-8'
Я загрузил проект на Github; Вы можете скачать и попробовать.
https://github.com/lambda2016/AjaxValidateAntiForgeryToken
источник
источник
Я знаю, что это старый вопрос. Но я все равно добавлю свой ответ, может помочь кому-то вроде меня.
Если вы не хотите обрабатывать результат от действия поста контроллера, как, например, вызов
LoggOff
методаAccounts
контроллера, вы можете сделать следующую версию ответа @DarinDimitrov:источник
В контроллере аккаунта:
Ввиду:
Важно , чтобы установить ,
contentType
чтобы'application/x-www-form-urlencoded; charset=utf-8'
или просто опуститьcontentType
из объекта ...источник
Я перепробовал много обходных путей, и ни один из них не помог мне. Исключением было "Обязательное поле формы защиты от подделки" __RequestVerificationToken ".
Что помогло мне, так это переключить форму .ajax на .post:
источник
Не стесняйтесь использовать функцию ниже:
}
источник
Токен не будет работать, если он был предоставлен другим контроллером. Например, это не будет работать, если представление было возвращено
Accounts
контроллером, а выPOST
-Clients
контроллеру.источник