Saya mengalami masalah dengan AntiForgeryToken dengan ajax. Saya menggunakan ASP.NET MVC 3. Saya mencoba solusi di panggilan jQuery Ajax dan Html.AntiForgeryToken () . Menggunakan solusi itu, token sekarang sedang diteruskan:
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) {
...
}
});
Ketika saya menghapus [ValidateAntiForgeryToken]
atribut hanya untuk melihat apakah data (dengan token) dilewatkan sebagai parameter ke controller, saya bisa melihat bahwa mereka sedang dilewatkan. Tetapi untuk beberapa alasan, A required anti-forgery token was not supplied or was invalid.
pesan itu masih muncul ketika saya mengembalikan atribut.
Ada ide?
EDIT
Antiforgerytoken sedang dibuat di dalam formulir, tapi saya tidak menggunakan tindakan kirim untuk mengirimkannya. Sebagai gantinya, saya hanya mendapatkan nilai token menggunakan jquery dan kemudian mencoba untuk posting ajax itu.
Ini adalah formulir yang berisi token, dan terletak di halaman utama master:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
sumber
contentType
untukapplication/json
karena server mengharapkan__RequestVerificationToken
parameter untuk menjadi bagian dari POST permintaan payload menggunakanapplication/x-www-form-urlencoded
.$(this).data('url'),
dapat memahami apa yang akan menjadi url controller dan action saya. tolong jelaskan. terima kasihPendekatan lain (kurang javascript) yang saya lakukan, berlangsung seperti ini:
Pertama, pembantu Html
itu akan mengembalikan sebuah string
jadi kita bisa menggunakannya seperti ini
Dan sepertinya berhasil!
sumber
@Html.AntiForgeryTokenForAjaxPost
dua untuk mendapatkan nama token di satu tangan dan nilainya di tangan lain. Kalau tidak, highlight sintaksis semuanya kacau. Itu berakhir seperti ini (menghapus tanda kutip tunggal dari hasil yang dikembalikan juga, sehingga berperilaku seperti pembantu MVC, misalnya @Url):'@Html.AntiForgeryTokenName' : '@Html.AntiForgeryTokenValue'
XElement.Parse(antiForgeryInputTag).Attribute("value").Value
var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); return XElement.Parse(antiForgeryInputTag).Attribute("value").Value
itu sangat sederhana! ketika Anda menggunakan
@Html.AntiForgeryToken()
kode html Anda itu berarti server telah menandatangani halaman ini dan setiap permintaan yang dikirim ke server dari halaman tertentu ini memiliki tanda yang dicegah untuk mengirim permintaan palsu oleh peretas. jadi agar halaman ini diautentikasi oleh server Anda harus melalui dua langkah:1. kirim parameter bernama
__RequestVerificationToken
dan untuk mendapatkan nilainya gunakan kode di bawah ini:misalnya menerima panggilan ajax
dan langkah 2 hiasi metode tindakan Anda dengan
[ValidateAntiForgeryToken]
sumber
Di Asp.Net Core Anda dapat meminta token secara langsung, seperti yang didokumentasikan :
Dan gunakan dalam javascript:
Anda dapat menambahkan filter global yang direkomendasikan, seperti yang didokumentasikan :
Memperbarui
Solusi di atas berfungsi dalam skrip yang merupakan bagian dari .cshtml. Jika ini bukan masalahnya maka Anda tidak dapat menggunakan ini secara langsung. Solusi saya adalah menggunakan bidang tersembunyi untuk menyimpan nilai terlebih dahulu.
Solusi saya, masih menggunakan
GetAntiXsrfRequestToken
:Ketika tidak ada formulir:
The
name
atribut dapat dihilangkan karena saya menggunakanid
atribut.Setiap formulir menyertakan token ini. Jadi, alih-alih menambahkan salinan lain dari token yang sama di bidang tersembunyi, Anda juga dapat mencari bidang yang sudah ada
name
. Harap dicatat: mungkin ada beberapa bentuk di dalam dokumen, jadiname
dalam hal ini tidak unik. Berbeda denganid
atribut yang harus unik.Dalam skrip, temukan oleh id:
Alternatif, tanpa harus merujuk token, adalah menyerahkan formulir dengan skrip.
Bentuk sampel:
Token ditambahkan secara otomatis ke formulir sebagai bidang tersembunyi:
Dan kirimkan dalam skrip:
Atau menggunakan metode posting:
sumber
Di Asp.Net MVC saat Anda menggunakan
@Html.AntiForgeryToken()
Razor membuat bidang input tersembunyi dengan nama__RequestVerificationToken
untuk menyimpan token. Jika Anda ingin menulis implementasi AJAX, Anda harus mengambil token ini sendiri dan meneruskannya sebagai parameter ke server sehingga dapat divalidasi.Langkah 1: Dapatkan token
Langkah 2: Lulus token di panggilan AJAX
Catatan : Jenis konten harus
'application/x-www-form-urlencoded; charset=utf-8'
Saya telah mengunggah proyek di Github; Anda dapat mengunduh dan mencobanya.
https://github.com/lambda2016/AjaxValidateAntiForgeryToken
sumber
sumber
Saya tahu ini adalah pertanyaan lama. Tapi saya akan menambahkan jawaban saya, mungkin bisa membantu orang seperti saya.
Jika Anda tidak ingin memproses hasil dari tindakan posting controller, seperti memanggil
LoggOff
metodeAccounts
controller, Anda dapat melakukan sebagai versi berikut dari jawaban @DarinDimitrov:sumber
Dalam Pengontrol akun:
Dalam penglihatan:
Hal ini penting untuk set
contentType
ke'application/x-www-form-urlencoded; charset=utf-8'
atau hanya menghilangkancontentType
dari objek ...sumber
Saya mencoba banyak workarrounds dan tidak ada yang berhasil untuk saya. Pengecualian adalah "Bidang formulir anti-pemalsuan yang diperlukan" __RequestVerificationToken ".
Apa yang membantu saya adalah mengganti formulir .ajax ke .post:
sumber
Silakan menggunakan fungsi di bawah ini:
}
sumber
Token tidak akan berfungsi jika dipasok oleh pengontrol yang berbeda. Misalnya tidak akan berfungsi jika tampilan dikembalikan oleh
Accounts
controller, tetapi AndaPOST
keClients
controller.sumber