it-swarm-tr.com

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

Web uygulamamda AJAX çağrısı yoluyla kimlik doğrulama bilgilerini gönderen bir giriş sayfası var. Kullanıcı doğru kullanıcı adı ve şifreyi girerse, her şey yolundadır, ancak değilse, aşağıdakiler gerçekleşir:

  1. Web sunucusu, isteğin iyi biçimlendirilmiş bir Yetki üstbilgisi içermesine rağmen, üstbilgideki kimlik bilgilerinin başarıyla 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-Kimlik doğrulaması başlığı içerir.
  3. Tarayıcı, XMLHttpRequest nesnesindeki çağrımın yanıtının bir 401 olduğunu ve cevabın WWW-Authenticate başlıkları içerdiğini tespit etti. Ardından, kullanıcı adınızı ve şifrenizi tekrar isteyen bir kimlik doğrulama iletişim kutusu açılır.

Bu adım 3'e kadar gayet güzel. Bu iletişim kutusunun açılmasını istemiyorum, 401 yanıtını AJAX geri arama işlevimde ele almak istiyorum. (Örneğin, giriş sayfasında bir hata mesajı görüntüleyerek.) Kullanıcının, kullanıcı adını ve şifresini elbette tekrar girmesini istiyorum, ancak tarayıcıya karşı çirkin değil, kullanıcı dostu ve güven veren giriş formumu görmelerini istiyorum. kimlik doğrulama iletişim kutusu.

Bu arada, sunucu üzerinde kontrolüm yok, bu yüzden özel bir durum kodu (yani, 401 dışında bir şey) döndürmek bir seçenek değil.

Kimlik doğrulama iletişim kutusunu gizlememin bir yolu var mı? Özellikle, Firefox 2 veya sonraki sürümlerinde Kimlik Doğrulama Gerekiyor iletişim kutusunu gizleyebilir miyim? IE 6 ve sonraki sürümlerde Connect to [Host] iletişim kutusunu bastırmanın bir yolu var mı?


Düzenle
Yazardan ek bilgi (18 Eylül):
Tarayıcının kimlik doğrulama iletişim kutusundaki asıl sorunun, kullanıcıya yeterli bilgi vermemesi olduğunu eklemeliyim.

Kullanıcı, giriş sayfasındaki form aracılığıyla bir kullanıcı adı ve şifre girmiştir, ikisini de doğru yazdığına inanmaktadır ve gönder düğmesine tıklamış ya da enter tuşuna basınız. Beklentisi, bir sonraki sayfaya götürüleceği veya belki de bilgilerini yanlış girdiğini ve tekrar denemesi gerektiğini söyledi. Ancak, bunun yerine beklenmedik bir iletişim kutusu ile sunulmaktadır.

İletişim kutusu sadece yaptı bir kullanıcı adı ve şifre girdiği gerçeğini onaylamaz. Bir sorunun olduğunu ve tekrar denemesi gerektiğini açıkça belirtmiyor. Bunun yerine, iletişim kutusu kullanıcıya "Site diyor ki: '[bölge]" gibi şifreli bilgiler sunar. [Realm] burada yalnızca bir programcının sevebileceği kısa bir bölge adıdır.

Web tarayıcısı tasarımcıları not aldı: hiç kimse, diyalogun kendisi daha kullanıcı dostu olsaydı, kimlik doğrulama iletişim kutusunun nasıl bastırılacağını sormazdı. Bir giriş formu yapmamın tamamı nedeni, ürün yönetimi ekibimizin tarayıcıların kimlik doğrulama iletişim kutularını haklı olarak görmesidir.

72
dgvid

Bunun mümkün olduğunu sanmıyorum - tarayıcının HTTP istemci uygulamasını kullanıyorsanız, her zaman bu iletişim kutusunu açacaktır. İki hack akla geliyor:

  1. Belki de Flash bunu farklı bir şekilde ele alıyor (henüz denemedim), bu nedenle bir flash filmin yapılması isteği 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.

17
Marijn

Burada da aynı sorunla karşılaştım ve şirketimdeki arka uç mühendisi görünüşe göre iyi bir uygulama olarak kabul edilen bir davranış sergiledi: bir URL'ye yapılan bir çağrı 401 döndürdüğünde, müşteri X-Requested-With: XMLHttpRequest başlığını ayarladıysa, sunucu www-authenticate başlığını bıraktığında cevabında. 

Yan etki, varsayılan kimlik doğrulama penceresinin görünmemesidir.

API aramanızın X-Requested-With başlığının XMLHttpRequest olarak ayarlandığından emin olun. Öyleyse, sunucu davranışını bu iyi uygulamaya göre değiştirmek dışında yapacak bir şey yok ...

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

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

HTTP yanıtını kontrol edebilirseniz, WWW-Authenticate başlığını yanıttan kaldırabilirsiniz ve tarayıcı giriş iletişim kutusunu açmaz.

Yanıtı kontrol edemiyorsanız, WWW-Authenticate başlığını yanıttan filtrelemek için bir proxy ayarlayabilirsiniz.

Bildiğim kadarıyla (yanılıyorsam beni düzeltmekten çekinmeyin), tarayıcı WWW-Authenticate başlığını aldıktan sonra oturum açma komutunu önlemenin bir yolu yoktur.

14
rustyx

Bu sorunun ve cevaplarının çok eski olduğunu biliyorum. Ama ben burada bitirdim. Belki diğerleri de olacaktır.

401'i döndüren web servisinin koduna erişiminiz varsa, bu durumda 401 yerine 403'ü (Yasak) iade etmek için servisi değiştirin. Tarayıcı, 403'e karşılık olarak kimlik bilgileri ister Belirli bir kaynak için yetkili olmayan kimliği doğrulanmış bir kullanıcı için doğru kodu. Bu OP'nin durumu gibi görünüyor.

403'teki IETF belgesinden:

.__ için yeterli olmayan geçerli bir kimlik bilgisi alan bir sunucu. 403 (Yasaklı) durum koduyla yanıt vermeli erişim hakkı kazanmalı

5
Jim Reineri

Mozilla'da, XMLHttpRequest nesnesini oluştururken aşağıdaki komut dosyasıyla başarabilirsiniz:

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

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

4
Yogesh

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

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

3
jan.vdbergh

jan.vdbergh gerçeği var, 401 sunucu tarafında başka bir durum kodu için değiştirirseniz, tarayıcı yakalamaz ve açılır pencereyi boyayın. başlığı. 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'da bu konuyla ilgili ilginç bir link var.

2
Kalamarico

Mozilla ülkesinde, XMLHttpRequest'in ( docs ) mozBackgroundRequest parametresini true değerine ayarlamak bu iletişim kutularını 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ığı da dahil).

2
rakslice

MVC 5 ve VPN'de de aynı sorunu yaşıyorum; VPN'i kullanırken DMZ dışında olduğumuzda, bu tarayıcı mesajını cevaplamak zorunda kalıyoruz. Net kullanarak sadece hatanın yönlendirme işlemek

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

şu ana kadar çalıştı, çünkü ev denetleyicisi altındaki Dizin eylemi kullanıcıyı doğrular. Oturum açma başarısız olursa, bu eylemdeki görünümde, Dizin Hizmetlerine iletilen LDAP sorgusunu kullanarak kullanıcıyı oturum açmak için kullandığım oturum açma denetimleri bulunur:

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

Bu, şu ana kadar iyi çalışsa da, hala test ettiğimi ve yukarıdaki kodun çalıştırılması için hiçbir neden bulunmadığını size bildirmek zorundayım, bu nedenle kaldırmaya maruz kalıyor ... test şu anda ikinci setin bulunduğu bir durumu keşfetmeye çalışmayı da içeriyor Kod daha fazla kullanım alanı. Yine, bu devam etmekte olan bir çalışma, ama bazı yardımlar için beynini biraz destekleyebileceği veya beynini dürtebileceği için, şimdi eklemeye karar verdim ... Tüm testler bittikten sonra nihai sonuçlarla güncelleyeceğim.

1
Clarence

Düğüm, Ekspres ve Pasaport kullanıyorum ve aynı sorunla mücadele ediyordum. Açıkça www-authenticate başlığını boş bir dizeye ayarlayarak çalışmasını sağladım. Benim durumumda, bu gibi görünüyordu:

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

Umarım bu birine yardım eder!

0
John Knotts

Burada C # kullananlar için 400 yerine 401 döndüren ActionAttribute ve 'yutar' Temel auth iletişim kutusu.

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.

0