5

W IIS mam:IE/IIS zintegrowane problemem uwierzytelniania

http://myserver/myapplication
http://myserver/reports

Aplikacja raporty są usługi w rzeczywistości, która używa uwierzytelniania systemu windows raportowania. myapplication to aplikacja asp.net używająca uwierzytelniania formularzy.

Serwer znajduje się poza domeną firmy. Jeśli najpierw uzyskaję dostęp do raportów i wpisz nazwę użytkownika i hasło (lokalne poświadczenia utworzone na serwerze) po wyświetleniu monitu, mogę uzyskać dostęp do strony raportów, bez problemów. Jeśli przejdę na stronę logowania mojej aplikacji i spróbuję się zalogować, strona logowania odświeża się, nie robiąc nic. Dzieje się tak zawsze w IE 6. W IE 7 zdarza się to sporadycznie. Nie dzieje się to w Firefoksie lub jeśli Fiddler działa w tle, który wydaje się rozwiązywać problem w locie.

Użyłem Wiresharka, aby zobaczyć, co się dzieje i odkryłem, że IE 6 wysyła token uwierzytelniania systemu Windows otrzymany z aplikacji raportów do mojej aplikacji. To była jedyna różnica między IE i Firefox. Wydaje się, że IIS przeraża i po prostu interpretuje mój POST na stronie logowania jako GET i zwraca.

Jeśli dodaję uwierzytelnianie systemu Windows do myapplication w IIS, wszystko wydaje się działać dobrze z każdą przeglądarką.

Dlaczego tak się dzieje? Błąd w IE czy coś mi brakuje?

Odpowiedz

13

To rodzaj błędu w IE, i sorta błąd w projekcie uwierzytelniania NTLM/Negotiate (aka Integrated) za pośrednictwem HTTP.

NTLM/Negocjacja to zorientowane na połączenie protokoły auth, dla których protokół HTTP nie był przeznaczony. W rezultacie, gdy potrzebujesz tego mechanizmu uwierzytelniania dla jednej strony na serwerze, IE zwykle zakłada, że ​​inne strony na serwerze mają takie same wymagania.

Ponadto, ze względu na wydajność i bezpieczeństwo, jeśli IE spodziewa Negocjuj/NTLM wyzwanie dla danego żądania POST, to będzie najpierw wysłać POST 0 bajtów, oczekując serwer zwraca HTTP/401 wyzwanie, do którego uwierzytelni, a następnie prawidłowo wyśle ​​treść POST.

Jednak w twoim przypadku folder, który nie wymaga Zintegrowanego auth, otrzymuje 0-bajtowy POST i mówi "Hrm, dziwne, 0-bajtowe." OK, HTTP/200, oto strona jak gdybyś używał GET. "

Ponieważ IE nigdy nie otrzyma wyzwania 401, którego oczekuje, nigdy nie wysyła ciała POST.

(Fiddler może nieco Cię pomylić z powodu działania połączenia HTTP).

Rozwiązaniem jest zapewnienie, że jeśli używasz Zintegrowanego uwierzytelniania na hoście, używaj go wszędzie.

+0

Dziękuję Eric, co by to naprawiło? IE powinien wysłać całą wiadomość POST, tak jak robi to Firefox, prawda? Wydaje mi się, że IE 8 działa, jeszcze go nie testowałem. –