Bidang formulir anti-pemalsuan yang diperlukan "__RequestVerificationToken" tidak menampilkan Kesalahan dalam Registrasi pengguna

141

Saya menggunakan Membership.createfungsi pengguna, maka kesalahan berikut terjadi,

Bidang formulir anti-pemalsuan yang diperlukan "__RequestVerificationToken" tidak ada

Bagaimana saya bisa memperbaikinya?

Hemant Soni
sumber

Jawaban:

218

Anda memiliki [ValidateAntiForgeryToken]atribut sebelum bertindak. Anda juga harus menambahkan @Html.AntiForgeryToken()dalam formulir Anda.

pengembang web
sumber
11
Saya memiliki halaman web yang memiliki masalah yang sama tetapi semuanya benar. apa kesalahannya?
DilakukanClever
@ConductedClever Anda harus hati-hati memeriksa semuanya (bidang, cookie) dengan fiddler dan / atau pembakar (semua perangkat pengembang browser), lihat artikel ini: asp.net/web-api/overview/security/…
webdeveloper
@ConductedClever saya juga. Itu berhasil tetapi jarang mendapatkan kesalahan ini dan saya tidak tahu MENGAPA?
QMaster
Saya memiliki semuanya baik-baik saja, dalam pengujian saya berfungsi, pada mesin klien itu berfungsi sampai saat ini, tetapi sekarang ia memberikan kesalahan ini. Saya tidak tahu kenapa. Apakah ada yang punya ide lain selain yang terdaftar di sini?
Andrei Dobrin
1
Html.AntiForgeryToken();tidak bekerja !! Berubah menjadi @Html.AntiForgeryToken()karya
FindOutIslamNow
78

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.

Justin Skiles
sumber
3
Dalam kasus saya web.config telah membutuhkanSSL tetapi ada ikatan IIS untuk port 80 dan 443, sehingga pengguna mengetik https mendapatkan perilaku yang benar dan pengguna mengetik http mendapatkan kesalahan ini, memasukkan aturan penulisan ulang untuk memaksa semua ke https: / / {HTTP_HOST} / {R: 1} memperbaikinya
user1069816
Terima kasih 😃 Dalam kasus saya di IISsini 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 httpsitu sama dengan domain dan itu memecahkan masalah. Saya memiliki pengaturan ulang IISuntuk memaksa http 2 httpsjuga.
RAM
61

Seperti ini:

Pengendali

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
     ...
     Code Block
     ...
}

Pandangan:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}
Subrata Sarkar
sumber
Coba gunakan hanya dalam HTML
Subrata Sarkar
41

Pastikan juga untuk tidak menggunakan [ValidateAntiForgeryToken] di bawah [HttpGet].

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }
Haiping Fan
sumber
1
Jawaban ini melengkapi yang lain dan menyelesaikan masalah saya! Terima kasih
Lucas
1
Jawaban ini mengasumsikan Anda tidak menyimpan data yang dikirimkan (yang seharusnya tidak berada di HttpGet). Jika ya, maka Anda masih memerlukan perlindungan XSRF yang disediakan [ValidateAntiForgeryToken].
thelem
9

Anda akan menerima kesalahan bahkan ketika Cookie tidak diaktifkan.

Vijaychandar
sumber
2
Hit yang bagus. Saya menggunakan Internet Explorer. Menggunakan browser Chrome memecahkan masalah bagi saya
FindOutIslamNow
Ini memecahkan masalah saya juga. mengaktifkan cookie di google chrome. Terima kasih
Metode Ilmiah
7

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.

Roma
sumber
6

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).

GeoffM
sumber
5

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

juFo
sumber
5

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.

Sean
sumber
Bagaimana Anda melihat bahwa kunci anti terpengaruh ketika Anda menonaktifkan input?
Cer
1
@ Cer - jika Anda bertanya bagaimana saya perhatikan, saya memeriksa permintaan dengan fiddler dan mengambil bahwa kuncinya tidak dikirim. Saya membaca bahwa pengiriman Html tidak akan menyertakan kontrol yang dinonaktifkan. Jadi saya mengubahnya readonlydan mengecualikan kontrol tersembunyi. Tampaknya bekerja dengan baik.
Sean
3

Jika ada yang mengalami kesalahan karena alasan yang sama mengapa saya mengalaminya, inilah solusi saya:

jika kamu punya Html.AntiForgeryToken();

ubah ke @Html.AntiForgeryToken()

Ditolak
sumber
2

Dalam kasus saya, domain yang salah di web.config untuk cookie adalah alasannya:

<httpCookies domain=".wrong.domain.com" />
Michael Logutov
sumber
ya! jika Anda pada komputer lokal ketik <httpCookies domain = "localhost" /> maka hanya pada cookie komputer lokal akan bekerja dan jika Anda mencoba untuk membuka situs Anda di komputer lain Anda akan memasukkannya ip (fe 192.168.1.43) yang tidak akan berfungsi karena mencari "localhost"
user3419036
2

Dalam kasus saya itu karena menambahkan requireSSL=trueuntuk httpcookiesdi webconfig yang membuat AntiForgeryToken berhenti kerja. Contoh:

<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>

Untuk membuat keduanya requireSSL=truedan @Html.AntiForgeryToken()berfungsi saya menambahkan baris ini di Application_BeginRequestdalamGlobal.asax

    protected void Application_BeginRequest(object sender, EventArgs e)
  {
    AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
  }
Ege Bayrak
sumber
2

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:

masukkan deskripsi gambar di sini

Ogglas
sumber
OK, itu berhasil. Tetapi ini terjadi berulang-ulang. Di Firefox proyek yang sama berjalan dengan benar. Apa yang dapat saya?
Bisakah Ürek
@ CanÜrek Apakah Anda memiliki beberapa proyek / situs berbeda dengan domain yang sama? Ex localhost, app.site.com dan app2.site.com dll? Ini biasanya terjadi karena ini.
Ogglas
0

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.

Goran Sneperger
sumber
0

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.

kevhann80
sumber
0

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.

Doug
sumber
0

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.

Masoud Darvishian
sumber
0

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();


Contoh

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)
    {
        ...
    }
demoncodemonkey
sumber
Bahkan jika Anda akan mendefinisikan struktur kelas MyDto Anda maka itu akan sangat membantu
Chandan Kumar
Yah saya tidak yakin itu akan sangat membantu dan kode contoh sudah lama hilang, jadi katakanlahpublic class MyDto { public bool Whatever { get; set; } }
demoncodemonkey
-1

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) { ....

Ran Lorch
sumber