Memukul kepalaku terlalu lama. Bagaimana cara mencegah pengguna menelusuri halaman situs setelah mereka keluar menggunakan FormsAuthentication.SignOut? Saya berharap ini melakukannya:
FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();
Tapi ternyata tidak. Jika saya mengetikkan URL secara langsung, saya masih bisa menjelajah ke halaman. Saya belum pernah menggunakan keamanan roll Anda sendiri, jadi saya lupa mengapa ini tidak berhasil.
Jawaban:
Pengguna masih dapat menjelajahi situs web Anda karena cookie tidak dihapus ketika Anda menelepon
FormsAuthentication.SignOut()
dan mereka diautentikasi pada setiap permintaan baru. Dalam dokumentasi MS disebutkan bahwa cookie akan dihapus tetapi tidak, bug? Persis sama denganSession.Abandon()
, cookie masih ada.Anda harus mengubah kode Anda menjadi ini:
HttpCookie
ada diSystem.Web
namespace. Referensi MSDN .sumber
Menggunakan dua dari posting di atas oleh x64igor dan Phil Haselden memecahkan ini:
1. x64igor memberi contoh untuk melakukan Logout:
Pertama-tama Anda harus menghapus Cookie Otentikasi dan Cookie Sesi dengan mengirimkan kembali cookie kosong dalam Respons terhadap Logout.
2. Phil Haselden memberi contoh di atas tentang cara mencegah caching setelah logout:
Anda perlu memvalidasi Cache di Sisi Klien melalui Respons .
sumber
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState"); HttpCookie sessionCookie = new HttpCookie(sessionStateSection.CookieName, "");
. Secara umum, nama cookie sesi tidak"ASP.NET_SessionId"
.Bagi saya sepertinya Anda tidak memiliki bagian otorisasi web.config Anda diatur dengan benar di dalamnya. Lihat di bawah untuk contoh.
sumber
Kuncinya di sini adalah Anda mengatakan "Jika saya mengetikkan URL secara langsung ...".
Secara default di bawah formulir otentikasi browser cache halaman untuk pengguna. Jadi, memilih URL langsung dari dropdown kotak alamat browser, atau mengetiknya, MUNGKIN mendapatkan halaman dari cache browser, dan tidak pernah kembali ke server untuk memeriksa otentikasi / otorisasi. Solusi untuk ini adalah untuk mencegah caching sisi klien dalam acara Page_Load setiap halaman, atau di OnLoad () dari halaman dasar Anda:
Anda mungkin juga ingin menelepon:
sumber
Saya telah berjuang dengan ini sebelumnya juga.
Berikut ini analogi dengan apa yang tampaknya terjadi ... Pengunjung baru, Joe, datang ke situs tersebut dan masuk melalui halaman login menggunakan FormsAuthentication. ASP.NET menghasilkan identitas baru untuk Joe, dan memberinya cookie. Cookie itu seperti kunci rumah, dan selama Joe kembali dengan kunci itu, ia dapat membuka kunci. Setiap pengunjung diberikan kunci baru dan kunci baru untuk digunakan.
Kapan
FormsAuthentication.SignOut()
dipanggil, sistem memberitahu Joe kehilangan kunci. Biasanya, ini berhasil, karena Joe tidak lagi memiliki kunci, dia tidak bisa masuk.Namun, jika Joe pernah kembali, dan melakukannya memiliki kunci yang hilang itu, ia akan masuk kembali!
Dari apa yang saya tahu, tidak ada cara untuk memberitahu ASP.NET untuk mengubah kunci di pintu!
Cara saya dapat hidup dengan ini adalah mengingat nama Joe dalam variabel Sesi. Ketika dia logout, saya meninggalkan Sesi jadi saya tidak memiliki namanya lagi. Kemudian, untuk memeriksa apakah dia diizinkan masuk, saya hanya membandingkan Identitasnya. Nama dengan apa yang dimiliki sesi saat ini, dan jika mereka tidak cocok, dia bukan pengunjung yang valid.
Singkatnya, untuk situs web, JANGAN mengandalkan
User.Identity.IsAuthenticated
tanpa juga memeriksa variabel Sesi Anda!sumber
Setelah banyak pencarian akhirnya ini berhasil untuk saya. Saya harap ini membantu.
sumber
Ini bekerja untuk saya
sumber
Kode yang Anda poskan sepertinya harus dengan benar menghapus token autentikasi bentuk, sehingga ada kemungkinan folder / halaman tersebut tidak benar-benar dilindungi.
Sudahkah Anda mengonfirmasi bahwa halaman tidak dapat diakses sebelum login telah terjadi?
Bisakah Anda memposting pengaturan web.config dan kode masuk yang Anda gunakan?
sumber
Saya telah menulis kelas dasar untuk semua Halaman saya dan saya sampai pada masalah yang sama. Saya memiliki kode seperti berikut ini dan tidak berfungsi. Dengan menelusuri, kontrol melewati dari pernyataan RedirectToLoginPage () ke baris berikutnya tanpa harus diarahkan.
Saya menemukan bahwa ada dua solusi. Entah untuk mengubah FormsAuthentication.RedirectToLoginPage (); menjadi
ATAU untuk memodifikasi web.config dengan menambahkan
Dalam kasus kedua, saat melacak, kontrol tidak mencapai halaman yang diminta. Ini telah dialihkan segera ke url login sebelum mengenai break point. Oleh karena itu, metode SignOut () bukan masalah, metode redirect adalah satu.
Saya harap itu dapat membantu seseorang
Salam
sumber
Saya baru saja mencoba beberapa saran di sini dan sementara saya bisa menggunakan tombol kembali browser, ketika saya mengklik pilihan menu token [Otorisasi] untuk [ActionResult] mengirim saya kembali ke layar login.
Ini kode logout saya:
Meskipun fungsi kembali pada browser membawa saya kembali dan menampilkan menu aman (saya masih mengerjakannya), saya tidak dapat melakukan apa pun yang diamankan dalam aplikasi.
Semoga ini membantu
sumber
<deny users="?" />
di web.config)Saya sudah mencoba sebagian besar jawaban di utas ini, tidak berhasil. Berakhir dengan ini:
Ditemukan di sini: http://forums.asp.net/t/1306526.aspx/1
sumber
Jawaban ini secara teknis identik dengan Khosro.Pakmanesh. Saya mempostingnya untuk mengklarifikasi bagaimana jawabannya berbeda dari jawaban lain di utas ini, dan di mana use case dapat digunakan.
Secara umum untuk menghapus sesi pengguna, lakukan
secara efektif akan mengeluarkan pengguna. Namun , jika dalam Permintaan yang sama Anda perlu memeriksa
Request.isAuthenticated
(seperti yang sering terjadi dalam Filter Otorisasi, misalnya), maka Anda akan menemukan bahwabahkan _setelah kamu lakukan
HttpContext.Session.Abandon()
danFormsAuthentication.SignOut()
.Satu-satunya hal yang berhasil adalah melakukannya
Itu secara efektif ditetapkan
Request.isAuthenticated = false
.sumber
Ini mulai terjadi pada saya ketika saya mengatur otentikasi> formulir> Path properti di
Web.config
. Menghapus yang memperbaiki masalah, danFormsAuthentication.SignOut();
cookie yang sederhana dihapus lagi.sumber
Bisa jadi Anda masuk dari satu subdomain (sub1.domain.com) dan kemudian mencoba keluar dari subdomain lain (www.domain.com).
sumber
Saya baru saja mengalami masalah yang sama, di mana SignOut () tampaknya gagal menghapus tiket dengan benar. Tetapi hanya dalam kasus tertentu, di mana beberapa logika lain menyebabkan pengalihan. Setelah saya menghapus pengalihan kedua ini (menggantinya dengan pesan kesalahan), masalahnya hilang.
Masalahnya pasti bahwa halaman dialihkan pada waktu yang salah, karenanya tidak memicu otentikasi.
sumber
Saya memiliki masalah yang sama sekarang dan saya percaya masalah dalam kasus saya serta poster aslinya adalah karena pengalihan. Secara default, Response.Redirect menyebabkan pengecualian yang segera muncul hingga ditangkap dan pengalihan segera dieksekusi, saya menduga ini mencegah pengumpulan cookie yang dimodifikasi agar tidak diturunkan ke klien. Jika Anda memodifikasi kode Anda untuk digunakan:
Ini mencegah pengecualian dan tampaknya memungkinkan cookie dikirim dengan benar ke klien.
sumber
Cobalah mengirim variabel sesi ketika Anda menekan masuk. Dan pada halaman pembuka, periksa dulu apakah sesi itu kosong seperti ini di halaman yang dimuat atau di Acara Init:
sumber
Bagi saya, pendekatan berikut ini berhasil. Saya pikir jika ada kesalahan setelah pernyataan "FormsAuthentication.SignOut ()", SingOut tidak berfungsi.
sumber
Apakah Anda menguji / melihat perilaku ini menggunakan IE? Mungkin saja IE menyajikan halaman-halaman itu dari cache. Sangat sulit untuk membuat IE mem-flush cache-nya, dan pada banyak kesempatan, bahkan setelah Anda logout, mengetik url salah satu halaman "aman" akan menampilkan konten yang di-cache dari sebelumnya.
(Saya telah melihat perilaku ini bahkan ketika Anda masuk sebagai pengguna yang berbeda, dan IE menunjukkan bilah "Selamat Datang" di bagian atas halaman Anda, dengan nama pengguna pengguna yang lama. Saat ini, biasanya sebuah reload akan memperbaruinya, tetapi jika tetap , itu masih bisa menjadi masalah caching.)
sumber
Melakukan Session.abandon () dan menghancurkan cookie berfungsi cukup baik. Saya menggunakan mvc3 dan sepertinya masalah terjadi jika Anda pergi ke halaman yang dilindungi, logout, dan pergi melalui riwayat browser Anda. Bukan masalah besar tapi masih agak menyebalkan.
Namun, mencoba menelusuri tautan di aplikasi web saya berfungsi dengan benar.
Menyetelnya untuk tidak melakukan caching browser mungkin merupakan cara yang harus dilakukan.
sumber
Untuk MVC ini bekerja untuk saya:
sumber
Saya ingin menambahkan beberapa informasi untuk membantu memahami masalahnya. Formulir Otentikasi memungkinkan untuk menyimpan data pengguna baik dalam cookie, atau dalam string kueri URL. Metode yang didukung situs Anda dapat dikonfigurasi dalam file web.config.
Menurut Microsoft :
Pada saat yang sama, mereka berkata :
Terakhir, tentang UseDeviceProfile, mereka mengatakan :
Menyatukan semua ini bersama-sama, tergantung pada browser pengguna, konfigurasi default dapat mengakibatkan CookiesSupported menjadi benar , yang berarti metode SignOut tidak menghapus tiket dari cookie. Ini tampaknya kontra-intuitif dan saya tidak tahu mengapa ia bekerja seperti ini - saya harapkan SignOut untuk benar-benar mengeluarkan pengguna dalam keadaan apa pun.
Salah satu cara untuk membuat SignOut bekerja dengan sendirinya adalah mengubah mode cookie menjadi "UseCookies" (yaitu cookie diperlukan) di file web.config:
Menurut pengujian saya, melakukan ini membuat SignOut bekerja dengan sendirinya dengan biaya situs Anda sekarang yang membutuhkan cookie untuk berfungsi dengan baik.
sumber
Ketahuilah bahwa WIF menolak memberitahu browser untuk membersihkan cookie jika pesan wsignoutcleanup dari STS tidak cocok dengan url dengan nama aplikasi dari IIS, dan maksud saya KASUS SENSITIF . WIF merespons dengan tanda centang OK hijau, tetapi tidak akan mengirim perintah untuk menghapus cookie ke browser.
Jadi, Anda perlu memperhatikan sensitivitas huruf url Anda.
Sebagai contoh, ThinkTecture Identity Server menyimpan url dari RP yang dikunjungi dalam satu cookie, tetapi itu membuat semuanya lebih kecil. WIF akan menerima pesan wsignoutcleanup dalam huruf kecil dan akan membandingkannya dengan nama aplikasi di IIS. Jika tidak cocok, itu tidak menghapus cookie, tetapi akan melaporkan OK ke browser. Jadi, untuk Server Identitas ini saya perlu menulis semua url di web.config dan semua nama aplikasi di IIS dalam huruf kecil, untuk menghindari masalah seperti itu.
Juga jangan lupa untuk mengizinkan cookie pihak ketiga di peramban jika Anda memiliki aplikasi di luar subdomain STS, jika tidak peramban tidak akan menghapus cookie meskipun WIF memberitahunya.
sumber