Tarayıcının kimlik doğrulama iletişim kutusunu nasıl bastırabilirim?


85

Web uygulamamın, bir AJAX çağrısı aracılığıyla kimlik doğrulama bilgilerini gönderen bir oturum açma sayfası var. Kullanıcı doğru kullanıcı adını ve şifreyi girerse, her şey yolunda, ancak değilse, aşağıdakiler gerçekleşir:

  1. Web sunucusu, isteğin iyi biçimlendirilmiş bir Yetkilendirme başlığı içermesine rağmen, başlıktaki kimlik bilgilerinin başarılı bir şekilde doğrulanmadığını belirler.
  2. Web sunucusu bir 401 durum kodu döndürür ve desteklenen kimlik doğrulama türlerini listeleyen bir veya daha fazla WWW-Authenticate başlığı içerir.
  3. Tarayıcı, XMLHttpRequest nesnesindeki çağrıma yanıtın bir 401 olduğunu ve yanıtın WWW-Authenticate üstbilgilerini içerdiğini algıladı. Ardından kullanıcı adı ve parolayı soran bir kimlik doğrulama iletişim kutusu açılır.

3. adıma kadar her şey yolunda. İletişim kutusunun açılmasını istemiyorum, AJAX geri arama işlevimde 401 yanıtını işlemek istiyorum. (Örneğin, giriş sayfasında bir hata mesajı görüntüleyerek.) Kullanıcının elbette kullanıcı adını ve şifresini yeniden girmesini istiyorum, ancak tarayıcının çirkin, varsayılanını değil, arkadaş canlısı, güven verici giriş formumu görmelerini istiyorum. kimlik doğrulama iletişim kutusu.

Bu arada, sunucu üzerinde hiçbir kontrole sahip değilim, bu nedenle özel bir durum kodu (yani, 401 dışında bir şey) döndürmesi bir seçenek değil.

Kimlik doğrulama iletişim kutusunu engellememin bir yolu var mı? Özellikle, Kimlik Doğrulama Gerekli iletişim kutusunu Firefox 2 veya sonraki sürümlerde engelleyebilir miyim? IE 6 ve sonraki sürümlerde [ana bilgisayar] iletişim kutusunu engellemenin herhangi bir yolu var mı ?


Yazardan
Ek Bilgileri Düzenleyin (18 Eylül):
Tarayıcının kimlik doğrulama iletişim kutusundaki asıl sorunun, kullanıcıya yetersiz bilgi vermesi olduğunu eklemeliyim.

Kullanıcı giriş sayfasındaki form aracılığıyla yeni bir kullanıcı adı ve şifre girmiştir, her ikisini de doğru yazdığına inanmaktadır ve gönder düğmesine tıklamış veya enter tuşuna basmıştır. Beklentisi, bir sonraki sayfaya götürüleceği veya belki de bilgilerini yanlış girdiği ve tekrar denemesi gerektiği söylenmesidir. Ancak, beklenmedik bir iletişim kutusu ile karşılaşır.

İletişim o sadece aslında hiçbir bildirim yapar yaptım bir kullanıcı adı ve şifre girin. Bir sorun olduğunu ve tekrar denemesi gerektiğini açıkça ifade etmiyor. Bunun yerine, iletişim kutusu kullanıcıya "Site şunu söylüyor: ' [bölge] ' gibi şifreli bilgiler sunar . Nerede [bölge] sadece bir programcı sevebileceğimi kısa bölge adıdır.

Web tarayıcısı tasarımcıları not alıyor: iletişim kutusunun kendisi basitçe daha kullanıcı dostu olsaydı kimse kimlik doğrulama iletişim kutusunu nasıl bastıracağını sormazdı. Bütün bir giriş formunu yapıyorum nedeni ürün yönetimi ekibi haklı tarayıcılar kimlik doğrulama diyaloglar korkunç olarak değerlendirdiği olmasıdır.


1
Cevap, iyi bir cevap olmadığıdır. Marijn'in önerdiği hackler olabildiğince yakın. Tabii ki, sunucu ve JavaScript'iniz tarafından anlaşılan, ancak tarayıcı tarafından anlaşılmayan özel bir kimlik doğrulama kullanmak da işe yarayacaktır, eğer mümkünse.
dgvid

Ben de aynı sorunla karşılaştım ve bu bağlantıyı burada stackoverflow'daki bir yorumda buldum (blogum değil): loudvchar.blogspot.ca/2010/11/… Umarım size yardımcı olur.
gies0r

Yanıtlar:


17

Bunun mümkün olduğunu sanmıyorum - tarayıcının HTTP istemci uygulamasını kullanırsanız, her zaman bu iletişim kutusunu açacaktır. Akla iki hile geliyor:

  1. Belki Flash bunu farklı şekilde ele alıyor (henüz denemedim), bu yüzden istekte bir flash film yaptırmak yardımcı olabilir.

  2. Kendi sunucunuzda eriştiğiniz hizmet için bir 'proxy' ayarlayabilir ve tarayıcının bunları tanımaması için kimlik doğrulama başlıklarını biraz değiştirmesini sağlayabilirsiniz.


"Proxie" hackinin işe yarayacağından şüphelenmeme rağmen, "mümkün değil" doğru cevap gibi görünüyor.
dgvid

@Stobor Gönderdiğiniz kopya için kabul edilen cevap, aslında cevabı olarak bu soruya geri bağlantı veriyor!
8bitjunkie

3
@ 7SpecialGems İyi yakalama. Bunun bir dupe olduğunu önermiyordum, kabul edilen cevaptan 4 yıl sonra gönderilen belirli cevaba (WWW-Authenticate cevabı) bağladım. Geriye dönüp baktığımda, buna neden baktığımı veya nasıl test ettiğimi hatırlayamıyorum.
Stobor

1
Bu kodla yetkisiz 401 hatasını yakalamaya çalışıyorum: $ .ajaxSetup ({statusCode: {401: function () {RedirectToLogin ();}}}); Ancak IE her zaman tarayıcının kimlik doğrulama iletişim kutusunu gösterir. ASP.Net MVC 2'de bu iletişim kutusunu nasıl bastırabilirim?
PaulP

@PaulP, söylendiği gibi, 401 durum kodu yanıtlarını WWW-Authenticate başlığından veya bir tür özel sunucu uygulamasından çıkaracak bir proxy'ye ihtiyacınız var.
Motes

51

Aynı sorunla burada karşılaştım ve şirketimdeki arka uç mühendisi, görünüşe göre iyi bir uygulama olarak kabul edilen bir davranış uyguladı: Bir URL'ye yapılan bir çağrı bir 401 döndürdüğünde, istemci üstbilgiyi ayarladıysa X-Requested-With: XMLHttpRequest, sunucu www-authenticateüstbilgiyi kendi tepki.

Yan etkisi, varsayılan kimlik doğrulama açılır penceresinin görünmemesidir.

API çağrınızın X-Requested-Withbaşlığının olarak ayarlandığından emin olun XMLHttpRequest. Eğer öyleyse, sunucu davranışını bu iyi uygulamaya göre değiştirmekten başka yapacak bir şey yok ...


3
Arka uç Java / Spring tabanlıysa, DelegatingAuthenticationEntryPointbu davranışı sizin için ele alır.
Derek Slife

Bunun için teşekkür ederim. Devise
josephnvu

1
bunu nginx'te nasıl yapacağınıza dair bir fikriniz var mı? "Bir URL'ye yapılan çağrı bir 401 döndürdüğünde, istemci X-Requested-With: XMLHttpRequest başlığını ayarladıysa, sunucu yanıtında www-Authenticate başlığını bırakır."
markmnl

18

Tarayıcı, aşağıdaki koşulların her ikisi de karşılandığında bir oturum açma istemi açar:

  1. HTTP durumu 4xx
  2. WWW-Authenticate yanıtta başlık var

HTTP yanıtını kontrol edebiliyorsanız, WWW-Authenticatebaşlığı yanıttan kaldırabilirsiniz ve tarayıcı oturum açma iletişim kutusunu açmaz.

Yanıtı kontrol edemezseniz, WWW-Authenticatebaşlığı yanıttan filtrelemek için bir proxy kurabilirsiniz .

Bildiğim kadarıyla (yanılıyorsam beni düzeltmekten çekinmeyin), tarayıcı WWW-Authenticatebaşlığı aldıktan sonra giriş istemini engellemenin bir yolu yok .


İyi bilgi. Geçerli WWW-Authenticatebaşlık değerleri ile ilgili olarak, stackoverflow.com/a/1748451/225217
adresine

6

Bu sorunun ve cevaplarının çok eski olduğunun farkındayım. Ama buraya geldim. Belki başkaları da yapacak.

401'i döndüren web hizmetinin koduna erişiminiz varsa, hizmeti 403 (Yasak) döndürecek şekilde değiştirin, bu durumda 401 yerine. Tarayıcı, 403'e yanıt olarak kimlik bilgilerini istemez. 403, belirli bir kaynak için yetkilendirilmemiş, kimliği doğrulanmış bir kullanıcı için doğru kod. OP'nin durumu bu gibi görünüyor.

403'teki IETF belgesinden:

Erişim elde etmek için yeterli olmayan geçerli kimlik bilgilerini alan bir sunucu, 403 (Yasak) durum koduyla yanıt vermelidir


4

Mozilla'da bunu XMLHttpRequest nesnesini oluşturduğunuzda aşağıdaki komut dosyasıyla elde edebilirsiniz:

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

2. satır iletişim kutusunu engeller ....


1
Bu görünür Firefox 3. altında, Firefox 2. DOM güvenlik hatasına yol açar, NS_ERROR_DOM_SECURITY_ERR kodu 1000 altında hiçbir şey yapmamak
dgvid

2

Hangi sunucu teknolojisini kullanıyorsunuz ve kimlik doğrulama için kullandığınız belirli bir ürün var mı?

Tarayıcı sadece işini yaptığından, 401 durum kodunu döndürmemek için sunucu tarafında bazı şeyleri değiştirmeniz gerektiğine inanıyorum. Bu, kimlik doğrulama başarısız olduğunda formu tekrar döndüren özel kimlik doğrulama formları kullanılarak yapılabilir.


2

Mozilla ülkesinde, XMLHttpRequest ( docs ) mozBackgroundRequest parametresinin true olarak ayarlanması, bu diyalogları bastırır ve isteklerin başarısız olmasına neden olur. Ancak, tarayıcılar arası desteğin ne kadar iyi olduğunu bilmiyorum (bu başarısız isteklerdeki hata bilgilerinin kalitesinin tarayıcılar arasında çok iyi olup olmadığı dahil).


Moz- öneki, tarayıcılar arası destek anlamına gelmez (diğer tarayıcıların her birinde çalışan benzer parametreler bulamadığınız sürece).
Brilliand

2

jan.vdbergh'in gerçeği vardır, eğer sunucu tarafında 401'i başka bir durum kodu için değiştirebilirseniz, tarayıcı açılır pencereyi yakalayıp boyamayacaktır. Başka bir çözüm, WWW-Authenticate başlığını başka bir özel başlık için değiştirmek olabilir. Farklı tarayıcının neden destekleyemediğine inanmıyorum, Firefox'un birkaç sürümünde xhr isteğini mozBackgroundRequest ile yapabiliriz, ancak diğer tarayıcılarda ?? burada, Chromium'daki bu sorunla ilgili ilginç bir bağlantı var.


1

MVC 5 ve VPN ile aynı sorunu yaşıyorum, VPN kullanarak DMZ'nin dışında olduğumuzda, kendimizi bu tarayıcı mesajına cevap vermek zorunda buluyoruz. .Net kullanarak hatanın yönlendirmesini basitçe

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

şu ana kadar işe yaradı çünkü ana denetleyicinin altındaki Dizin eylemi kullanıcıyı doğrular. Bu eylemdeki görünüm, oturum açma başarısız olursa, kullanıcıyı Dizin Hizmetlerine iletilen LDAP sorgusunu kullanarak oturum açmak için kullandığım oturum açma denetimlerine sahiptir:

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

Bu şimdiye kadar iyi çalışmış olsa da, hala test ettiğimi ve yukarıdaki kodun çalıştırılması için hiçbir neden olmadığını, bu nedenle kaldırılabileceğini bilmenizi isterim ... şu anda test etme, ikinci setin olduğu bir durumu keşfetmeye çalışmayı içerir kodun artık faydası var. Yine, bu devam eden bir çalışmadır, ancak biraz yardımcı olabileceği veya bazı fikirler için beyninizi çalıştırabileceği için, şimdi eklemeye karar verdim ... Tüm testler tamamlandıktan sonra nihai sonuçlarla güncelleyeceğim.


1

Node, Express & Passport kullanıyorum ve aynı sorunla uğraşıyordum. www-authenticateBaşlığı açıkça boş bir dizeye ayarlayarak çalışmasını sağladım. Benim durumumda şöyle görünüyordu:

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

Umarım bu birine yardımcı olur!


0

C # sözünü söyleyenler için, burada yerine ActionAttributedöner ve Temel kimlik doğrulama iletişim kutusunu 'yutar'.400401

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

aşağıdaki gibi kullanın:

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

Umarım bu size biraz zaman kazandırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.