2009-03-29 14 views
23

Mam sytuację z dużą wewnętrzną aplikacją korporacyjną działającą w sieci ASP.NET 3.5 na IIS6 generującą 401 odpowiedzi "Nieautoryzowane", po których następuje 200 odpowiedzi "Ok" (jako profilowane przez Fiddler). Jestem świadomy, dlaczego tak się dzieje (zintegrowana autoryzacja zmuszająca przeglądarkę do ponownego wysłania referencji), ale szukam pomysłów, jak zminimalizować lub wyeliminować sytuację. Ta aplikacja działa w sieci WAN, a niektórzy użytkownicy mają opóźnienie do 250ms, więc wymuszenie kolejnego żądania może mieć zauważalny wpływ na czas wczytywania strony, szczególnie gdy na stronach jest wiele kaskadowych list rozwijanych.Wyeliminowanie odpowiedzi 401 "Nieautoryzowane", po których następuje 200 odpowiedzi "OK"

Użytkownicy aplikacji są wewnętrzni w zarządzanym środowisku graficznym, więc mechanizmy zmuszające przeglądarkę do wysyłania referencji na pierwsze żądanie (czy to możliwe?) Mogą być możliwe z perspektywy wdrożenia. Będzie to działało na stronach wymagających tożsamości użytkownika, ale dla zasobów niewymagających uwierzytelniania (WebResource.axd, ScriptResource.axd i niektórych niestandardowych usług internetowych), umożliwiając anonimowe uwierzytelnianie. Przyjrzałem się definiując to na podstawie lokalizacji w web.config, ale wyniki były mieszane (nadal liczba 401 odpowiedzi).

Byłbym wdzięczny za wskazówki dotyczące "najlepszej praktyki" w zakresie radzenia sobie z tą sytuacją. Istnieje wiele zasobów, które identyfikują problem, ale żaden z nich nie zawiera możliwych rozwiązań.

Dzięki!

Edytuj: Zasoby niewymagające uwierzytelniania (np. Usługi internetowe wykorzystywane do kaskadowania list rozwijanych) można zamówić anonimowo, dodając wpis lokalizacji do konfiguracji sieci, ale jeszcze nie znajduję odpowiedzi na uwierzytelnione zasoby.

+0

Jakiej przeglądarki używają? Większość przeglądarek zawsze wysyła podstawowe poświadczenia uwierzytelniania http. Odpowiedź prawdopodobnie zależy od przeglądarki. – recursive

+0

Przeglądarka to IE6, a niektórzy użytkownicy są migrowani do IE7. –

Odpowiedz

15

Niestety jest to artefakt o HTTP NTLM authentication scheme.

Krótko mówiąc, przeglądarka (Internet Explorer lub inna) nie wie, że musi w ogóle się uwierzytelnić, dopóki nie zostanie odrzucona z odpowiedzią 401 zawierającą nagłówek odpowiedzi w postaci WWW-Authenticate.

W przypadku WWW-Authenticate: NTLM - tyle nieznośno - wymaga dwa 401 odpowiedzi na jednym trwałego połączenia, aby zakończyć i proces ten musi być powtórzony raz HTTP trwałe połączenie jest zamknięty. Więc nawet jeśli udało się zmusić przeglądarkę do zainicjowania żądania ślepo próbującego NTLM, nie można usunąć co najmniej jednej odpowiedzi 401 z transakcji.

Myślę, że najlepiej byłoby zmaksymalizować czas, w którym stałe połączenia pozostają otwarte, gdy są bezczynne.

+0

Sprawdź ustawienia IIS. http://msdn.microsoft.com/en-us/library/aa347472.aspx Możesz grać z tymi ustawieniami, aby zmniejszyć liczbę żądań 401. Bądź jednak ostrożny przy swoich wyborach .. AuthPersistNonNTLM, authPersistSingleRequest – batspy

0

Wierzę, że możesz przekonać Firefoksa do automatycznego wysyłania poświadczeń NTLM do umieszczonego na białej liście zestawu domen poprzez ustawienia "about: config" - użyj ustawienia "network.automatic-ntlm-auth.trusted-uris". Jednak sam tego nie próbowałem. Nie jestem pewien, czy istnieje odpowiednik dla Internet Explorera.

Niestety jeśli używasz czegoś innego jak Kerberos nie wydaje się być sposobem na uniknięcie 401.

+0

Dzięki BRH, niestety zależność jest na IE6 i 7. –

+2

Ustawienie 'network.automatic-ntlm-auth.trusted-uris' podczas opisywania pozwala Firefoksowi na uwierzytelnianie bez pytania użytkownika o referencje domeny, ale nie rozwiązać "problem" wzoru 401-401-200. Jest to część uwierzytelniania NTLM i będzie zawsze występować, niezależnie od ustawień przeglądarki. – hmqcnoesy

0

Może zaistnieć potrzeba rozważenia Uwierzytelniania za pomocą formularzy, jeśli opóźnienie wywołane przez 401 jest zbyt długie. Użytkownicy musieliby się jawnie logować, ale tylko raz. Następnie możesz użyć schematu cookie lub cookieless i uzyskać odpowiedź za pierwszym razem.

Wyobrażam sobie, że ładowanie strony byłoby powolne, gdyby istniały kaskadowe menu rozwijane, a początkowe ładowanie strony wypełni jedną wartość, która spowoduje, że POST pobierze następną listę, ustawi tę wartość, inny POST, aby uzyskać kolejną listę ponownie, i tak dalej.Jeśli tak jest, być może trzeba wypełnić wszystkie te listy w pierwszej rundzie, zamiast czekać na odpowiedzi POST.

3

Cscript.exe c: \ inetpub \ adminscripts \ adsutil.vbs set W3SVC/AuthPersistSingleRequest FAŁSZ

zmniejszy kwotę 401 znacząco.

Powiązane problemy