Saya sedang membangun satu aplikasi halaman dan mengalami masalah dengan token anti-pemalsuan.
Saya tahu mengapa masalah ini terjadi, saya tidak tahu cara memperbaikinya.
Saya mendapatkan kesalahan saat hal berikut terjadi:
- Pengguna yang tidak masuk log dialog (dengan token anti-pemalsuan yang dihasilkan)
- Pengguna menutup dialog
- Pengguna masuk
- Pengguna membuka dialog yang sama
- Pengguna mengirimkan formulir dalam dialog
Token anti pemalsuan dimaksudkan untuk pengguna "" tetapi pengguna saat ini adalah "nama pengguna"
Alasan ini terjadi adalah karena aplikasi saya 100% satu halaman, dan ketika seorang pengguna berhasil masuk melalui posting ajax /Account/JsonLogin
, saya cukup mengalihkan tampilan saat ini dengan "tampilan terotentikasi" yang dikembalikan dari server tetapi tidak memuat ulang halaman.
Saya tahu ini alasannya karena jika saya memuat ulang halaman dengan mudah antara langkah 3 dan 4, tidak ada kesalahan.
Jadi tampaknya @Html.AntiForgeryToken()
dalam bentuk yang dimuat masih mengembalikan token untuk pengguna lama hingga halaman dimuat ulang.
Bagaimana saya bisa berubah @Html.AntiForgeryToken()
untuk mengembalikan token untuk pengguna baru yang diautentikasi?
Saya menyuntikkan baru GenericalPrincipal
dengan kustom IIdentity
pada setiap Application_AuthenticateRequest
sehingga pada saat @Html.AntiForgeryToken()
dipanggil HttpContext.Current.User.Identity
, sebenarnya Identitas kustom saya dengan IsAuthenticated
properti disetel ke true namun @Html.AntiForgeryToken
masih tampaknya memberikan token untuk pengguna lama kecuali saya melakukan memuat ulang halaman.
sumber
Jawaban:
Ini terjadi karena token anti-pemalsuan menyematkan nama pengguna sebagai bagian dari token terenkripsi untuk validasi yang lebih baik. Ketika Anda pertama kali menelepon
@Html.AntiForgeryToken()
pengguna tidak masuk sehingga token akan memiliki string kosong untuk nama pengguna, setelah pengguna login, jika Anda tidak mengganti token anti-pemalsuan itu tidak akan lulus validasi karena token awal adalah untuk pengguna anonim dan sekarang kami memiliki pengguna yang diautentikasi dengan nama pengguna yang dikenal.Anda memiliki beberapa opsi untuk menyelesaikan masalah ini:
Hanya kali ini biarkan SPA Anda melakukan POST penuh dan ketika halaman memuatnya akan memiliki token anti-pemalsuan dengan nama pengguna yang diperbarui tertanam.
Dapatkan tampilan sebagian dengan adil
@Html.AntiForgeryToken()
dan benar setelah masuk, lakukan permintaan AJAX lain dan ganti token anti-pemalsuan yang ada dengan respons dari permintaan tersebut.Cukup nonaktifkan identitasnya untuk memeriksa validasi anti-pemalsuan yang dilakukan. Menambahkan berikut untuk Anda Application_Start metode:
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true
.sumber
Untuk memperbaiki kesalahan Anda perlu menempatkan
OutputCache
Anotasi Data pada halaman DapatkanActionResult
Login sebagai:sumber
Ini sering terjadi pada aplikasi saya, jadi saya memutuskan untuk mencari di google!
Saya menemukan penjelasan sederhana tentang kesalahan ini! Pengguna mengklik dua kali tombol untuk masuk! Anda dapat melihat pengguna lain membicarakannya di tautan di bawah:
MVC 4 menyediakan token anti-pemalsuan yang dimaksudkan untuk pengguna "" tetapi pengguna saat ini adalah "pengguna"
Saya harap ini membantu! =)
sumber
Saya memiliki masalah yang sama, dan hack kotor ini memperbaikinya, setidaknya sampai saya bisa memperbaikinya dengan cara yang lebih bersih.
...
sumber
Pesan muncul ketika Anda masuk saat Anda sudah diautentikasi.
Pembantu ini melakukan hal yang persis sama dengan
[ValidateAntiForgeryToken]
atribut.Hapus
[ValidateAntiForgeryToken]
atribut dari controller dan tempatkan helper ini dalam metode aksi.Jadi ketika pengguna sudah diautentikasi, arahkan kembali ke beranda atau jika tidak melanjutkan verifikasi token anti-pemalsuan yang valid setelah verifikasi ini.
sumber
Saya memiliki pengecualian yang sama yang terjadi sebagian besar waktu di server produksi.
Mengapa itu terjadi?
Itu terjadi ketika pengguna login dengan kredensial yang valid dan sekali login dan redirect ke halaman lain, dan setelah mereka menekan tombol kembali akan menampilkan halaman login dan lagi ia memasukkan kredensial yang valid bahwa waktu pengecualian ini akan terjadi.
Bagaimana menyelesaikan?
Cukup tambahkan baris ini dan bekerja dengan sempurna, tidak ada kesalahan.
sumber
Saya memiliki masalah yang cukup spesifik namun serupa dalam proses pendaftaran. Setelah pengguna mengklik tautan email yang dikirimkan kepada mereka, mereka akan login dan dikirim langsung ke layar detail akun untuk mengisi beberapa informasi lebih lanjut. Kode saya adalah:
Saya menemukan bahwa Return View ("AccountDetails") memberi saya pengecualian token, saya menduga karena fungsi ConfirmEmail didekorasi dengan AllowAnonymous tetapi fungsi AccountDetails telah ValidateAntiForgeryToken.
Mengubah Return to Return RedirectToAction ("AccountDetails") memecahkan masalah bagi saya.
sumber
Anda dapat menguji ini dengan meletakkan break point pada baris pertama dari tindakan Login (Get) Anda. Sebelum menambahkan arahan OutputCache breakpoint akan mengenai beban pertama, tetapi setelah mengklik tombol kembali browser itu tidak. Setelah menambahkan arahan Anda harus berakhir dengan breakpoint dipukul setiap waktu, sehingga AntiForgeryToken akan menjadi yang korektif, bukan yang kosong.
sumber
Saya memiliki masalah yang sama dengan aplikasi ASP.NET MVC Core satu halaman. Saya mengatasinya dengan menetapkan
HttpContext.User
dalam semua tindakan pengontrol yang mengubah klaim identitas saat ini (karena MVC hanya melakukan ini untuk permintaan berikutnya, seperti yang dibahas di sini ). Saya menggunakan filter hasil alih-alih middleware untuk menambahkan cookie antiforgery ke respons saya, yang memastikan bahwa itu hanya dihasilkan setelah tindakan MVC kembali.Pengontrol (NB. Saya mengelola pengguna dengan ASP.NET Core Identity):
Filter hasil untuk menambahkan cookie antiforgery:
Ekstrak Startup.cs:
sumber
Punya masalah dengan validasi anti-pemalsuan-token di internet-shop: pengguna membuka banyak tab (dengan barang) dan setelah masuk pada satu mencoba masuk pada yang lain dan mendapat AntiForgeryException tersebut. Jadi, AntiForgeryConfig.SuppressIdentityHeuristicChecks = true tidak membantu saya, jadi saya menggunakan peretasan jelek seperti itu, mungkin itu akan membantu seseorang:
Berpikir itu akan bagus jika opsi generasi anti-pemalsuan-token dapat diatur, untuk mengecualikan nama pengguna atau sesuatu seperti itu.
sumber