Saya menggunakan Membership.create
fungsi pengguna, maka kesalahan berikut terjadi,
Bidang formulir anti-pemalsuan yang diperlukan "__RequestVerificationToken" tidak ada
Bagaimana saya bisa memperbaikinya?
Saya menggunakan Membership.create
fungsi pengguna, maka kesalahan berikut terjadi,
Bidang formulir anti-pemalsuan yang diperlukan "__RequestVerificationToken" tidak ada
Bagaimana saya bisa memperbaikinya?
Jawaban:
Anda memiliki [ValidateAntiForgeryToken]
atribut sebelum bertindak. Anda juga harus menambahkan @Html.AntiForgeryToken()
dalam formulir Anda.
Html.AntiForgeryToken();
tidak bekerja !! Berubah menjadi @Html.AntiForgeryToken()
karya
Dalam kasus saya, saya memiliki ini di web.config saya:
<httpCookies requireSSL="true" />
Tetapi proyek saya ditetapkan untuk tidak menggunakan SSL. Mengomentari garis itu atau mengatur proyek untuk selalu menggunakan SSL menyelesaikannya.
IIS
sini ada pengikatan ( https » EmptyHostName » IP » 443
) tetapi tidak ada pengikatan untuk ( https » www.mysite.com » IP » 443
). Jadi saya menambahkan ikatan baru dengan nama host yang tidak kosong untuk https
itu sama dengan domain dan itu memecahkan masalah. Saya memiliki pengaturan ulang IIS
untuk memaksa http 2 https
juga.
Seperti ini:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Pastikan juga untuk tidak menggunakan [ValidateAntiForgeryToken] di bawah [HttpGet].
[HttpGet]
public ActionResult MethodName()
{
..
}
Anda akan menerima kesalahan bahkan ketika Cookie tidak diaktifkan.
Hal lain yang dapat menyebabkan ini (hanya berlari ke ini) adalah sebagai berikut: jika Anda karena suatu alasan menonaktifkan semua bidang input Anda di formulir Anda. itu akan menonaktifkan bidang input tersembunyi yang menyimpan token verifikasi Anda. ketika formulir akan diposting kembali nilai token akan hilang dan akan menghasilkan kesalahan yang hilang. jadi yang perlu Anda lakukan adalah mengaktifkan kembali bidang input yang menyimpan token verifikasi dan semuanya akan baik-baik saja.
Kemungkinan lain bagi kita yang mengunggah file sebagai bagian dari permintaan. Jika panjang konten melebihi <httpRuntime maxRequestLength="size in kilo bytes" />
dan Anda menggunakan token verifikasi permintaan, browser menampilkan 'The required anti-forgery form field "__RequestVerificationToken" is not present'
pesan alih-alih panjang permintaan melebihi pesan.
Mengatur maxRequestLength ke nilai yang cukup besar untuk memenuhi permintaan menyembuhkan masalah langsung - meskipun saya akui itu bukan solusi yang tepat (kami ingin pengguna tahu masalah sebenarnya dari ukuran file, bukan dari token verifikasi permintaan yang hilang).
Pastikan di controller Anda bahwa Anda memiliki atribut http seperti:
[HttpPost]
juga tambahkan atribut di controller:
[ValidateAntiForgeryToken]
Dalam formulir Anda pada pandangan Anda, Anda harus menulis:
@Html.AntiForgeryToken();
Saya memiliki Html.AntiForgeryToken (); tanpa tanda @ saat berada di blok kode, itu tidak memberikan kesalahan dalam Razor tetapi lakukan saat runtime. Pastikan Anda melihat tanda @ dari @ Html. Tidak .. apakah ada yang hilang atau tidak
Dalam kasus saya, saya punya javascript ini pada formulir kirim:
$('form').submit(function () {
$('input').prop('disabled', true);
});
Ini menghapus RequestVerificationToken yang disembunyikan dari formulir yang dikirimkan. Saya mengubahnya menjadi:
$('form').submit(function () {
$('input[type=submit]').prop('disabled', true);
$('input[type=text]').prop('readonly', true);
$('input[type=password]').prop('readonly', true);
});
... dan itu bekerja dengan baik.
readonly
dan mengecualikan kontrol tersembunyi. Tampaknya bekerja dengan baik.
Dalam kasus saya, domain yang salah di web.config untuk cookie adalah alasannya:
<httpCookies domain=".wrong.domain.com" />
Dalam kasus saya itu karena menambahkan requireSSL=true
untuk httpcookies
di webconfig yang membuat AntiForgeryToken berhenti kerja. Contoh:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Untuk membuat keduanya requireSSL=true
dan @Html.AntiForgeryToken()
berfungsi saya menambahkan baris ini di Application_BeginRequest
dalamGlobal.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
Mendapat kesalahan ini di Chrome dengan login default untuk ASP.NET dengan Akun Pengguna Individual
.cshtml:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Use a local account to log in.</h4>
Pengendali:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
Dipecahkan dengan menghapus data situs untuk situs:
Dalam solusi EPiServer saya pada beberapa pengontrol ada atribut ContentOutputCache pada tindakan Indeks yang menerima HttpGet. Setiap tampilan untuk tindakan tersebut berisi formulir yang memposting ke tindakan HttpPost ke controller yang sama atau ke yang berbeda. Segera setelah saya menghapus atribut itu dari semua masalah tindakan Indeks itu hilang.
Karena ini muncul dengan pencarian pertama ini:
Saya memiliki masalah ini hanya di Internet Explorer dan tidak bisa mengetahui apa masalahnya. Singkatnya cerita itu tidak menyimpan bagian cookie dari Token karena (sub) domain kami memiliki garis bawah di dalamnya. Bekerja di Chrome tetapi IE / Edge tidak menyukainya.
Semua jawaban lain di sini juga valid, tetapi jika tidak ada satu pun dari mereka menyelesaikan masalah, patut juga memeriksa bahwa tajuk yang sebenarnya diteruskan ke server.
Misalnya, dalam lingkungan yang seimbang beban di belakang nginx, konfigurasi default adalah untuk menghapus header __RequestVerificationToken sebelum meneruskan permintaan ke server, lihat: sederhana proxy reverse nginx tampaknya menghapus beberapa header.
Kadang-kadang Anda menulis metode tindakan formulir dengan daftar hasil. Dalam hal ini, Anda tidak dapat bekerja dengan satu metode tindakan. Jadi, Anda harus memiliki dua metode tindakan dengan nama yang sama. Satu [HttpGet]
dengan [HttpPost]
atribut lainnya.
Dalam [HttpPost]
metode tindakan Anda , atur [ValidateAntiForgeryToken]
atribut dan juga masukkan @Html.AntiForgeryToken()
dalam bentuk html Anda.
Dalam kasus saya, saya mendapatkan kesalahan ini saat membuat posting AJAX, ternyata nilai __RequestVerificationToken tidak diteruskan dalam panggilan. Saya harus secara manual menemukan nilai bidang ini dan menetapkan ini sebagai properti pada objek data yang dikirim ke titik akhir.
yaitu
data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();
HTML
<form id="myForm">
@Html.AntiForgeryToken()
<!-- other input fields -->
<input type="submit" class="submitButton" value="Submit" />
</form>
Javascript
$(document).on('click', '#myForm .submitButton', function () {
var myData = { ... };
myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();
$.ajax({
type: 'POST',
url: myUrl,
data: myData,
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
dataType: 'json',
success: function (response) {
alert('Form submitted');
},
error: function (e) {
console.error('Error submitting form', e);
alert('Error submitting form');
},
});
return false; //prevent form reload
});
Pengendali
[HttpPost]
[Route("myUrl")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyUrlAsync(MyDto dto)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
saya ingin berbagi milik saya, saya telah mengikuti tutorial anti forgerytoken ini
menggunakan asp.net mvc 4 dengan angularjs, tetapi ia melempar pengecualian setiap kali saya meminta menggunakan $ http.post dan saya menemukan solusinya hanya menambahkan
'X- Diminta-Dengan ':' XMLHttpRequest ' ke header $ http.post, karena sepertinya (filterContext.HttpContext.Request.IsAjaxRequest())
tidak mengenalinya sebagai ajax dan di sini adalah contoh kode saya.
App.js
var headers = {
'X-Requested-With': 'XMLHttpRequest',
'RequestVerificationToken': $scope.token,
'Content-Type': 'application/json; charset=utf-8;'
};
$http({
method: 'POST',
url: baseURL + 'Save/User',
data: JSON.stringify($scope.formData),
headers: headers
}).then(function (values) {
alert(values.data);
}).catch(function (err) {
console.log(err.data);
});
SaveController
[HttpPost]
[MyValidateAntiForgeryToken]
public ActionResult User(UserModel usermodel)
{
....