Saya tahu bahwa ada ribuan laporan tentang orang yang mengalami kesulitan mendapatkan Otentikasi Windows Terpadu untuk bekerja dengan IIS, tetapi semuanya tampaknya mengarah ke halaman web yang tidak berlaku atau solusi yang sudah saya coba. Saya telah menyebarkan lusinan situs seperti ini sebelumnya, jadi entah ada sesuatu yang aneh terjadi dengan server / konfigurasi, atau saya telah melihat ini terlalu lama dan tidak melihat yang jelas.
Sederhananya, semuanya bekerja dengan baik pada mesin lokal saya, tetapi berantakan pada server produksi, yang sejauh yang saya tahu memiliki konfigurasi yang sama persis .
Di mesin lokal:
- Mesin ini menjalankan Windows 7 Ultimate, Service Pack 1, IIS 7.5.
- Situs ini telah diuji dengan sukses, menggunakan IIS dan Server Pengembangan Web VS.
- Konfigurasi situs IIS menonaktifkan semua metode otentikasi kecuali Otentikasi Windows.
- Mesin lokal tidak ada di domain mana pun.
- Penyiapan Penyedia adalah Negosiasi dan NTLM (bukan Negosiasi: Kerberos).
- Extended Protection Off.
- Semua browser yang diuji (IE, Firefox, Chrome) menunjukkan prompt tantangan dan memungkinkan saya untuk masuk ke domain host lokal dengan akun Windows (lokal) saya.
- Semua browser yang diuji juga berfungsi menggunakan alamat IP lokal yang tidak jelas - sehingga browser itu sendiri sepertinya tidak peduli apakah situs tersebut tampak "lokal" atau "jauh".
- Saya telah menambahkan baris tampilan ke halaman web yang menunjukkan pengguna yang saat ini masuk dan menunjukkan apa yang saya harapkan (pengguna lokal mana pun yang saya gunakan untuk masuk).
Pada mesin jarak jauh:
- Server menjalankan Windows Server 2008 R2, IIS 7.5.
- Memuat halaman web mengakibatkan kesalahan langsung 401.2: Anda tidak berwenang melihat halaman ini karena tajuk otentikasi tidak valid. Tidak ada tantangan yang muncul.
- Konfigurasi situs IIS menonaktifkan semua metode otentikasi kecuali Otentikasi Windows.
- Mesin jarak jauh tidak ada di domain mana pun.
- Penyiapan Penyedia adalah Negosiasi dan NTLM (bukan Negosiasi: Kerberos).
- Extended Protection Off.
- Pada mesin jarak jauh (sesi desktop jarak jauh), kesalahan yang sama muncul di Internet Explorer terlepas dari apakah domain tersebut adalah localhost atau alamat IP eksternal.
- Jika saya mencoba melihat situs web jarak jauh dari mesin lokal saya , kesalahannya masih 401, tetapi 401 sedikit berbeda. Tidak ada subkode, dengan teks: Akses ditolak karena kredensial tidak valid.
- The Windows Authentication fitur peran IIS yang diinstal.
- The WindowsAuthentication Modul ini ditambahkan (di tingkat Server).
- Kesalahan yang sama persis terjadi jika saya mematikan Otentikasi Windows dan mengaktifkan Otentikasi Dasar.
- Situs ini memuat jika saya mematikan Otentikasi Windows dan mengaktifkan Anonim (jelas).
- Saya sudah mengikuti semua langkah pemecahan masalah di Dukungan Microsoft: Mengatasi masalah kesalahan HTTP 401 di IIS
- Saya sudah mencoba solusi yang ditunjukkan pada halaman dukungan Microsoft lainnya (seharusnya untuk memaksa NTLM sebagai satu-satunya metode).
Terakhir tetapi tidak kalah pentingnya, saya mencoba menyalakan FREB untuk kesalahan 401.2 dan hasilnya sepertinya tidak memberi tahu saya apa pun yang berguna, yang saya lihat adalah peringatan berikut:
MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName IIS Web Core
Notification 2
HttpStatus 401
HttpReason
HttpSubStatus 2 Tidak ResmiCode
2147942405
ConfigExceptionInfo
Notification AUTHENTICATE_REQUEST
Akses ErrorCode ditolak. (0x80070005)
... ini sepertinya hanya memberi tahu saya apa yang sudah saya ketahui (bahwa itu hanya menolak permintaan alih-alih menegosiasikan kredensial).
Jejak tidak menunjukkan bahwa modul WindowsAuthentication dimuat dengan benar karena ada NOTIFY_MODULE_START
garis dengan ModuleName
= WindowsAuthentication
(dan berbagai peristiwa tindak lanjut ASP.NET lainnya - [un] untungnya, tidak ada kesalahan atau peringatan yang menarik di sini).
Adakah yang bisa memberi tahu saya apa yang mungkin saya lewatkan di sini?
Pembaruan Cepat:
Saya sedikit tidak nyaman mengirim seluruh pembuangan Wireshark karena akan mengungkapkan IP, URL, dan hal-hal lain, tapi saya melakukan perbandingan tanggapan HTTP dari localhost dan server jarak jauh di Fiddler, dan tampaknya cukup mandiri -jelas apa masalahnya:
Localhost:
HTTP / 1.1 401 Tidak Sah Kontrol Cache: pribadi Jenis-Konten: teks / html; charset = utf-8 Server: Microsoft-IIS / 7.5 Otentikasi WWW: Bernegosiasi Otentikasi WWW: NTLM X-Didukung-Oleh: ASP.NET Tanggal: Sabtu, 17 Des 2011 23:42:34 GMT Panjang Konten: 6399 Dukungan Proxy: Sesi-Berbasis-Otentikasi
Terpencil:
HTTP / 1.1 401 Tidak Sah Jenis-Konten: teks / html Server: Microsoft-IIS / 7.5 X-Didukung-Oleh: ASP.NET Tanggal: Sabtu, 17 Des 2011 23:43:13 GMT Panjang Konten: 1293
Selain beberapa perbedaan yang tampaknya tidak penting seperti kontrol cache, perbedaan utamanya adalah server jarak jauh tidak mengirim header WWW-Authenticate kembali ke klien.
Jadi, saya kira itu mempersempit pertanyaan menjadi: Mengapa IIS tidak mengirim header WWW-Authenticate ketika Windows Authentication tampaknya diinstal, dimuat, dan diaktifkan secara eksklusif?
sumber
Jawaban:
Masalah terpecahkan. Saya akhirnya memutuskan untuk membandingkan daftar modul berdampingan dan sebenarnya ada satu yang hilang. Ternyata ada dua modul Otentikasi Windows:
Di server,
WindowsAuthentication
modul yang dikelola ada di sana, tetapi bukan yang asli yangWindowsAuthenticationModule
disorot di atas. Mengapa itu dikonfigurasikan seperti itu adalah dugaan siapa pun, tetapi ternyata jika modul asli tidak dimuat, modul yang dikelola akan dengan senang hati memuat dan gagal.Jadi untuk setiap pembaca di masa depan yang mengalami masalah ini, pastikan Anda memiliki kedua modul yang dimuat , karena IIS tidak akan memperingatkan Anda jika salah satu dari mereka hilang.
sumber
Kami menemukan ini tidak serta merta memperbaiki masalah bagi pengembang yang bekerja secara lokal di situs ASP.NET yang berjalan di bawah Otentikasi Windows. Kami menemukan peretasan registri yang menonaktifkan pemeriksaan loopback; ini memperbaikinya: -
kunci registri - HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa
Buat DWORD dengan nilai 1 yang disebut "DisableLoopbackCheck"
Anda harus me-reboot mesin agar pengaturannya berlaku
sumber