it-swarm-id.com

Bagaimana saya bisa menekan dialog otentikasi browser?

Aplikasi web saya memiliki halaman login yang mengirimkan kredensial otentikasi melalui panggilan AJAX. Jika pengguna memasukkan nama pengguna dan kata sandi yang benar, semuanya baik-baik saja, tetapi jika tidak, yang berikut ini terjadi:

  1. Server web menentukan bahwa meskipun permintaan menyertakan tajuk Otorisasi yang terbentuk dengan baik, kredensial dalam tajuk tidak berhasil mengautentikasi.
  2. Server web mengembalikan kode status 401 dan menyertakan satu atau lebih header WWW-Authenticate yang mencantumkan jenis otentikasi yang didukung.
  3. Browser mendeteksi bahwa respons terhadap panggilan saya pada objek XMLHttpRequest adalah 401 dan responsnya mencakup header WWW-Authenticate. Kemudian muncul dialog otentikasi yang meminta, lagi, nama pengguna dan kata sandi.

Ini semua baik-baik saja sampai langkah 3. Saya tidak ingin dialog muncul, saya ingin menangani respons 401 dalam fungsi panggilan balik AJAX saya. (Misalnya, dengan menampilkan pesan kesalahan pada halaman login.) Saya ingin pengguna memasukkan kembali nama pengguna dan kata sandi mereka, tentu saja, tetapi saya ingin mereka melihat formulir login saya yang ramah dan meyakinkan, bukan browser yang jelek, default dialog otentikasi.

Kebetulan, saya tidak punya kendali atas server, jadi setelah itu mengembalikan kode status khusus (mis., Sesuatu selain 401) bukanlah suatu pilihan.

Apakah ada cara saya bisa menekan dialog otentikasi? Secara khusus, dapatkah saya menekan dialog Diperlukan Otentikasi di Firefox 2 atau lebih baru? Apakah ada cara untuk menekan dialog Connect to [Host] di IE 6 dan yang lebih baru?


Edit
Informasi tambahan dari penulis (18 September):
Saya harus menambahkan bahwa masalah sebenarnya dengan dialog otentikasi browser muncul adalah memberikan informasi yang tidak memadai kepada pengguna.

Pengguna baru saja memasukkan nama pengguna dan kata sandi melalui formulir di halaman login, ia yakin telah mengetik keduanya dengan benar, dan ia telah mengklik tombol kirim atau tekan enter. Harapannya adalah bahwa ia akan dibawa ke halaman berikutnya atau mungkin diberitahu bahwa ia telah memasukkan informasi yang salah dan harus mencoba lagi. Namun, ia malah disajikan dengan kotak dialog yang tidak terduga.

Dialog tidak mengakui fakta bahwa dia hanya melakukan memasukkan nama pengguna dan kata sandi. Tidak jelas menyatakan bahwa ada masalah dan bahwa ia harus mencoba lagi. Alih-alih, kotak dialog menyajikan informasi rahasia kepada pengguna seperti "Situs ini mengatakan: '[realm]'." Di mana [realm] adalah nama ranah pendek yang hanya bisa disukai oleh seorang programmer.

Desainer web broswer perhatikan: tidak ada yang akan bertanya bagaimana menekan dialog otentikasi jika dialog itu sendiri lebih mudah digunakan. Alasan seluruh bahwa saya melakukan formulir login adalah bahwa tim manajemen produk kami menganggap dialog otentikasi browser sebagai hal yang buruk.

72
dgvid

Saya rasa ini tidak mungkin - jika Anda menggunakan implementasi klien HTTP browser, itu akan selalu muncul dialog itu. Dua retas muncul di pikiran:

  1. Mungkin Flash menangani ini secara berbeda (saya belum mencoba), jadi memiliki film flash membuat permintaan mungkin membantu.

  2. Anda dapat mengatur 'proxie' untuk layanan yang Anda akses di server Anda sendiri, dan membuatnya sedikit memodifikasi header otentikasi, sehingga browser tidak mengenalinya.

17
Marijn

Saya mengalami masalah yang sama di sini, dan insinyur backend di perusahaan saya menerapkan perilaku yang tampaknya dianggap praktik yang baik: ketika panggilan ke URL mengembalikan 401, jika klien telah menetapkan header X-Requested-With: XMLHttpRequest, server menjatuhkan header www-authenticate dalam jawabannya. 

Efek sampingnya adalah popup otentikasi standar tidak muncul.

Pastikan panggilan API Anda memiliki header X-Requested-With yang diatur ke XMLHttpRequest. Jika demikian, tidak ada yang dapat dilakukan selain mengubah perilaku server menurut praktik yang baik ini ...

Browser menampilkan Prompt login ketika kedua kondisi berikut dipenuhi:

  1. Status HTTP adalah 4xx
  2. Header WWW-Authenticate hadir dalam respons

Jika Anda dapat mengontrol respons HTTP, maka Anda dapat menghapus header WWW-Authenticate dari respons, dan browser tidak akan memunculkan dialog login.

Jika Anda tidak dapat mengontrol respons, Anda dapat mengatur proxy untuk memfilter header WWW-Authenticate dari respons.

Sejauh yang saya tahu (jangan ragu untuk mengoreksi saya jika saya salah), tidak ada cara untuk mencegah Prompt login begitu browser menerima header WWW-Authenticate.

14
rustyx

Saya menyadari bahwa pertanyaan ini dan jawabannya sudah sangat tua. Tapi, saya berakhir di sini. Mungkin orang lain juga akan melakukannya.

Jika Anda memiliki akses ke kode untuk layanan web yang mengembalikan 401. Cukup ubah layanan untuk mengembalikan 403 (Terlarang) dalam situasi ini sebagai gantinya 401. Browser tidak akan Meminta kredensial sebagai tanggapan atas 403. 403 adalah kode yang benar untuk pengguna yang diautentikasi yang tidak diotorisasi untuk sumber daya tertentu. Yang tampaknya menjadi situasi OP.

Dari dokumen IETF pada 403:

Server yang menerima kredensial valid yang tidak memadai untuk mendapatkan akses harus merespons dengan kode status 403 (Terlarang)

5
Jim Reineri

Di Mozilla Anda bisa mencapainya dengan skrip berikut ketika Anda membuat objek XMLHttpRequest:

xmlHttp=new XMLHttpRequest();
xmlHttp.mozBackgroundRequest = true;
xmlHttp.open("GET",URL,true,USERNAME,PASSWORD);
xmlHttp.send(null);

Baris ke-2 mencegah kotak dialog ....

4
Yogesh

Teknologi server apa yang Anda gunakan dan apakah ada produk tertentu yang Anda gunakan untuk otentikasi?

Karena browser hanya melakukan tugasnya, saya percaya Anda harus mengubah hal-hal di sisi server untuk tidak mengembalikan kode status 401. Ini dapat dilakukan dengan menggunakan formulir otentikasi khusus yang hanya mengembalikan formulir lagi ketika otentikasi gagal.

3
jan.vdbergh

jan.vdbergh memiliki kebenaran, jika Anda dapat mengubah 401 di sisi server untuk kode status lain, browser tidak akan menangkap dan melukis munculan . Solusi lain dapat mengubah header WWW-Otentikasi untuk kustom lain tajuk. Saya tidak percaya mengapa browser yang berbeda tidak dapat mendukungnya, dalam beberapa versi Firefox kita dapat melakukan permintaan xhr dengan mozBackgroundRequest, tetapi di browser lain ?? di sini, ada tautan yang menarik dengan masalah ini di Chromium.

2
Kalamarico

Di Mozilla land, mengatur parameter mozBackgroundRequest dari XMLHttpRequest ( docs ) menjadi benar menekan dialog tersebut dan menyebabkan permintaan gagal. Namun, saya tidak tahu seberapa baik dukungan lintas-browser (termasuk apakah kualitas info kesalahan pada permintaan yang gagal itu sangat baik di seluruh browser.)

2
rakslice

Saya memiliki masalah yang sama dengan MVC 5 dan VPN di mana setiap kali kami berada di luar DMZ menggunakan VPN, kami harus menjawab pesan browser ini. Menggunakan .net saya hanya menangani perutean kesalahan menggunakan

<customErrors defaultRedirect="~/Error"  >
  <error statusCode="401" redirect="~/Index"/>
</customErrors>

sejauh ini telah berhasil karena tindakan Indeks di bawah pengontrol rumah memvalidasi pengguna. Tampilan dalam tindakan ini, jika masuk tidak berhasil, memiliki kontrol masuk yang saya gunakan untuk mencatat pengguna menggunakan kueri LDAP yang diteruskan ke Layanan Direktori:

      DirectoryEntry entry = new DirectoryEntry("LDAP://OurDomain");
      DirectorySearcher Dsearch = new DirectorySearcher(entry);
      Dsearch.Filter = "(SAMAccountName=" + UserID + ")";
      Dsearch.PropertiesToLoad.Add("cn");

Meskipun ini telah bekerja dengan baik sejauh ini, dan saya harus memberi tahu Anda bahwa saya masih mengujinya dan kode di atas tidak memiliki alasan untuk dijalankan sehingga dapat dihapus ... pengujian saat ini termasuk mencoba menemukan kasus di mana set kedua kode ada gunanya lagi. Sekali lagi, ini adalah pekerjaan yang sedang berjalan, tetapi karena bisa membantu atau menyiasati otak Anda untuk beberapa ide, saya memutuskan untuk menambahkannya sekarang ... Saya akan memperbaruinya dengan hasil akhir setelah semua pengujian dilakukan.

1
Clarence

Saya menggunakan Node, Express & Passport dan berjuang dengan masalah yang sama. Saya membuatnya bekerja dengan secara eksplisit mengatur header www-authenticate ke string kosong. Dalam kasus saya, terlihat seperti ini:

(err, req, res, next) => {
  if (err) {
    res._headers['www-authenticate'] = ''
    return res.json(err)
  }
}

Saya harap itu membantu seseorang!

0
John Knotts

Bagi mereka yang tidak memiliki C # inilah ActionAttribute yang mengembalikan 400 alih-alih 401, dan dialog autentikasi dasar 'menelan'.

public class NoBasicAuthDialogAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Result = new HttpStatusCodeResult(400);
    }
}

gunakan seperti berikut:

[NoBasicAuthDialogAuthorize(Roles = "A-Team")]
public ActionResult CarType()
{
 // your code goes here
}

Semoga ini menghemat waktu Anda.

0