Mam problem z AntiForgeryTokenem z ajaxem. Korzystam z ASP.NET MVC 3. Próbowałem rozwiązania w wywołaniach jQuery Ajax i Html.AntiForgeryToken () . Korzystając z tego rozwiązania, token jest teraz przekazywany:
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) {
...
}
});
Kiedy usuwam [ValidateAntiForgeryToken]
atrybut, aby sprawdzić, czy dane (z tokenem) są przekazywane jako parametry do kontrolera, widzę, że są przekazywane. Ale z jakiegoś powodu A required anti-forgery token was not supplied or was invalid.
komunikat nadal pojawia się, gdy przywracam atrybut.
Jakieś pomysły?
EDYTOWAĆ
W formularzu generowany jest żeton przeciw fałszerstwu, ale nie używam akcji przesyłania, aby go przesłać. Zamiast tego po prostu pobieram wartość tokena za pomocą jquery, a następnie próbuję opublikować to ajax.
Oto formularz, który zawiera token i znajduje się na górnej stronie wzorcowej:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
źródło
contentType
to,application/json
ponieważ serwer oczekuje, że__RequestVerificationToken
parametr będzie częścią ładunku żądania POST przy użyciuapplication/x-www-form-urlencoded
.$(this).data('url'),
może zrozumieć, jaki byłby adres URL mojego kontrolera i akcji. proszę wytłumacz. dziękiInne (mniej javascriptowe) podejście, które zrobiłem, wygląda mniej więcej tak:
Najpierw pomocnik HTML
która zwróci ciąg
więc możemy tego używać w ten sposób
I wydaje się, że działa!
źródło
@Html.AntiForgeryTokenForAjaxPost
dwie części, aby uzyskać nazwę tokena w jednej ręce i jego wartość w drugiej. W przeciwnym razie podświetlenie składni jest pomieszane. Kończy się w ten sposób (usunięto również pojedyncze cudzysłowy z zwróconego wyniku, aby zachowywał się jak każdy pomocnik MVC, na przykład @Url):'@Html.AntiForgeryTokenName' : '@Html.AntiForgeryTokenValue'
XElement.Parse(antiForgeryInputTag).Attribute("value").Value
var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); return XElement.Parse(antiForgeryInputTag).Attribute("value").Value
to takie proste! kiedy używasz
@Html.AntiForgeryToken()
w swoim kodzie html, oznacza to, że serwer podpisał tę stronę, a każde żądanie wysyłane do serwera z tej konkretnej strony ma znak uniemożliwiający wysłanie fałszywego żądania przez hakerów. więc aby ta strona została uwierzytelniona przez serwer, należy wykonać dwa kroki:1. wyślij parametr o nazwie
__RequestVerificationToken
i pobierz jego wartość użyj poniższych kodów:na przykład weź wywołanie Ajax
i krok 2 po prostu udekoruj swoją metodę działania przez
[ValidateAntiForgeryToken]
źródło
W Asp.Net Core możesz bezpośrednio zażądać tokenu, zgodnie z dokumentacją :
I użyj go w javascript:
Możesz dodać zalecany filtr globalny, zgodnie z dokumentacją :
Aktualizacja
Powyższe rozwiązanie działa w skryptach, które są częścią pliku .cshtml. Jeśli tak nie jest, nie możesz tego użyć bezpośrednio. Moim rozwiązaniem było użycie ukrytego pola do przechowywania wartości w pierwszej kolejności.
Moje obejście, nadal używam
GetAntiXsrfRequestToken
:Gdy nie ma formularza:
name
Atrybut może zostać pominięte, ponieważ używamid
atrybut.Każdy formularz zawiera ten token. Zamiast więc dodawać kolejną kopię tego samego tokena w ukrytym polu, możesz również wyszukać istniejące pole według
name
. Uwaga: dokument może zawierać wiele formularzy, więcname
w tym przypadku nie jest on unikalny. W przeciwieństwie doid
atrybutu, który powinien być unikalny.W skrypcie znajdź według identyfikatora:
Alternatywą, bez konieczności odwoływania się do tokena, jest przesłanie formularza za pomocą skryptu.
Przykładowy formularz:
Token jest automatycznie dodawany do formularza jako ukryte pole:
I prześlij w scenariuszu:
Lub za pomocą metody wysyłania:
źródło
W Asp.Net MVC, gdy używasz
@Html.AntiForgeryToken()
Razor, tworzy ukryte pole wejściowe z nazwą__RequestVerificationToken
do przechowywania tokenów. Jeśli chcesz napisać implementację AJAX, musisz samodzielnie pobrać ten token i przekazać go jako parametr do serwera, aby można go było zweryfikować.Krok 1: Zdobądź token
Krok 2: Przekaż token w wywołaniu AJAX
Uwaga : typ zawartości powinien być
'application/x-www-form-urlencoded; charset=utf-8'
Wrzuciłem projekt na Github; możesz go pobrać i wypróbować.
https://github.com/lambda2016/AjaxValidateAntiForgeryToken
źródło
źródło
Wiem, że to stare pytanie. Ale i tak dodam swoją odpowiedź, może pomóc komuś takiemu jak ja.
Jeśli nie chcesz przetwarzać wyniku z akcji post kontrolera, na przykład wywoływania
LoggOff
metodyAccounts
kontrolera, możesz zrobić następującą wersję odpowiedzi @DarinDimitrov:źródło
W kontrolerze konta:
Z uwagi:
Ważne jest, aby zestaw
contentType
do'application/x-www-form-urlencoded; charset=utf-8'
lub po prostu pominąćcontentType
z obiektu ...źródło
Wypróbowałem wiele sposobów obejścia tego problemu i żadne z nich nie działało dla mnie. Wyjątkiem było „Wymagane pole formularza zapobiegające fałszowaniu” __RequestVerificationToken ”.
Pomogło mi przejście z formularza .ajax na .post:
źródło
Zapraszam do skorzystania z poniższej funkcji:
}
źródło
Token nie zadziała, jeśli został dostarczony przez inny kontroler. Np. To nie zadziała, jeśli widok został zwrócony przez
Accounts
kontroler, a TyPOST
doClients
kontrolera.źródło