Przejdź do głównej zawartości
Pomoc techniczna
Zaloguj się przy użyciu konta Microsoft
Zaloguj się lub utwórz konto.
Witaj,
Wybierz inne konto.
Masz wiele kont
Wybierz konto, za pomocą którego chcesz się zalogować.

Kolumna głosowa pomocy technicznej programu ASP .NET

Rozwiązywanie problemów z uwierzytelnianiem formularzy

Witamy w kolumnie ASP.NET Support Voice! Nazywam się Jerry Orman. Pracuję z firmą Microsoft od ponad 5 lat i większość czasu poświęcam na skoncentrowanie się na technologiach związanych z siecią Web, takich jak Microsoft FrontPage i nowe technologie programu Microsoft SharePoint. Ostatni rok pracy z firmą Microsoft ASP.NET jako inżynier pomocy technicznej. W tym miesiącu w kolumnie Support Voice wyjaśnię, jak rozwiązywać problemy z uwierzytelnianiem formularzy w usłudze Microsoft ASP.NET.

Rozwiązywanie problemów z uwierzytelnianiem formularzy

Podczas korzystania z uwierzytelniania formularzy w aplikacji ASP.NET może okazać się konieczne rozwiązanie problemu, który występuje, gdy użytkownik jest losowo przekierowywany na stronę logowania. W idealnym świecie ten problem występuje w sposób, który pozwala łatwo dołączyć debuger i uchwycić problem. Jednak w środowiskach produkcyjnych rzadko tak jest. Aby rozwiązać losowy problem, taki jak ten, musisz zarejestrować informacje związane z tym problemem, aby można było zawęzić główną przyczynę.

W tej kolumnie krótko omówimy koncepcję uwierzytelniania formularzy. Następnie przyjrzymy się, które scenariusze prowadzą do przekierowania użytkownika na stronę logowania i jak przechwytywać dane, które są istotne w celu odizolowania problemu. Omówimy również, jak zaimplementować interfejs IHttpModule w celu rejestrowania informacji o uwierzytelnianiu formularzy.

Omówienie uwierzytelniania formularzy

Gdy użytkownik uwierzytelnia się w witrynie sieci Web przy użyciu uwierzytelniania formularzy, serwer tworzy plik cookie. Wartość pliku cookie to zaszyfrowany bilet uwierzytelniania formularzy. Plik cookie jest przekazywany do serwera w każdym żądaniu do aplikacji, a klasa FormsAuthenticationModule odszyfrowuje wartość pliku cookie i określa, czy użytkownik jest prawidłowy, czy nie.

Domyślnie klasa FormsAuthenticationModule jest dodawana do pliku Machine.config. Klasa FormsAuthenticationModule zarządza procesem FormsAuthentication.

Poniżej znajduje się wpis z pliku Machine.config:

<httpModule>
     …other modules…
     <add name="FormsAuthentication"
         type="System.Web.Security.FormsAuthenticationModule" />
     …other modules…
</httpModule>

Ogólny ruch HTTP do uwierzytelniania przy użyciu uwierzytelniania formularzy wygląda podobnie do następującego:

  1. Klient wysyła http get do default.aspx. Nie jest wysyłany żaden plik cookie uwierzytelniania formularzy.

  2. Serwer wysyła odpowiedź 302 (przekierowanie) do pliku Login.aspx.

  3. Klient wysyła wpis HTTP do witryny Login.aspx. Zawiera informacje logowania.

  4. Serwer wysyła odpowiedź 302 (przekierowanie) do pliku Default.aspx. Plik cookie uwierzytelniania formularzy jest dołączany.

  5. Klient wysyła http get do default.aspx. Dotyczy to również pliku cookie uwierzytelniania formularzy.

Aby uzyskać więcej informacji na temat implementowania i używania uwierzytelniania formularzy, odwiedź następujące witryny sieci Web MSDN:

http://msdn2.microsoft.com/en-us/library/7t6b43z4.aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthentication(vs.71).aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket(vs.71).aspxAby uzyskać więcej informacji na temat udostępniania plików cookie uwierzytelniania formularzy, odwiedź następującą ASP.NET witrynę sieci Web:

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx

Powody, dla których użytkownik może zostać przekierowany na stronę logowania

Plik cookie uwierzytelniania formularzy zostanie utracony

Scenariusz 1


W tym scenariuszu użytkownik loguje się do witryny sieci Web. W pewnym momencie klient wysyła żądanie do serwera, a
Klasa FormsAuthenticationModule nie otrzymuje pliku cookie. Możesz określić, czy żądanie użytkownika nie zawiera pliku cookie, włączając rejestrowanie plików cookie w Microsoft Internet Information Services (IIS). Aby to zrobić, wykonaj następujące czynności:

  1. Otwórz program IIS Microsoft Management Console (MMC).

  2. Kliknij prawym przyciskiem myszy witrynę sieci Web, a następnie kliknij polecenie
    Właściwości.

  3. Kliknij kartę Witryna sieci Web , a następnie kliknij pozycję Włącz rejestrowanie.

  4. Upewnij się, że format dziennika to rozszerzony format pliku dziennika W3C.

  5. Kliknij przycisk Właściwości.

  6. Kliknij kartę Zaawansowane , a następnie kliknij pozycję
    Właściwości rozszerzone.

  7. W obszarze Właściwości rozszerzone kliknij pole wyboru Plik cookie(cs(Cookie)) i pole wyboru Referer (cs(Referer) ).

Po wystąpieniu tego problemu określ, który klient miał problem i adres IP tego klienta. Przefiltruj dziennik IIS adresu IP tego klienta i wyświetl <kolumnę> pliku cookie.

Uwaga Za pomocą analizy dzienników można analizować dzienniki usług IIS. Aby pobrać analizator dzienników, odwiedź następującą witrynę internetową firmy Microsoft:

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 Po wyświetleniu listy żądań od tego konkretnego użytkownika wyszukaj żądania na stronie logowania. Wiesz, że przekierowano je na tę stronę i chcesz wyświetlić żądania przed przekierowaniem. Jeśli widzisz coś podobnego do poniższego, klient nie wysłał pliku cookie lub plik cookie został usunięty w sieci między klientem a serwerem.

Jest to początkowe logowanie.

Metoda

Strona

Odpowiedzi

Pliki cookie

POBIERZ

/Default.aspx

302 (Przekierowywanie)

Brak plików cookie

POBIERZ

/Login.aspx

200 (Sukces)

Brak plików cookie

POST

/Login.aspx

302 (Przekierowywanie)

Brak plików cookie

POBIERZ

/Default.aspx

200 (Sukces)

. ASPXAUTH

POBIERZ

/SomePage.aspx

302 (Przekierowywanie)

Nr. ASPXAUTH Cookie

Są to inne żądania, a następnie prośba o stronę w witrynie bez . Plik cookie ASPXAUTH.

Metoda

Strona

Odpowiedzi

Pliki cookie

POBIERZ

/SomePage.aspx

302 (Przekierowywanie)

Nr. ASPXAUTH Cookie

POBIERZ

/Login.aspx

200 (Sukces)

Nr. ASPXAUTH Cookie

POST

/Login.aspx

302 (Przekierowywanie)

Nr. ASPXAUTH Cookie

POBIERZ

/SomePage.aspx

200 (Sukces)

. ASPXAUTH


Uwaga Pierwsze żądanie od tego użytkownika prawdopodobnie nie będzie miało pliku cookie uwierzytelniania formularzy, chyba że tworzysz trwały plik cookie. Dziennik IIS będzie zawierać tylko pliki cookie, które zostały odebrane w żądaniu. Pierwsze żądanie utworzenia pliku cookie uwierzytelniania formularzy będzie na żądanie po pomyślnej próbie logowania.

Scenariusz 2


Plik cookie uwierzytelniania formularzy może również zostać utracony po przekroczeniu limitu plików cookie klienta. W programie Microsoft Internet Explorer obowiązuje ograniczenie do 20 plików cookie. Po utworzeniu 20 pliku cookie na kliencie poprzednie pliki cookie są usuwane z kolekcji klienta. Jeśli przycisk . Plik cookie ASPXAUTH zostanie usunięty, użytkownik zostanie przekierowany do strony logowania po przetworzeniu następnego żądania.

Te dwa scenariusze można rozwiązać w ten sam sposób. Spójrz na żądanie tuż przed przekierowaniem do strony logowania. Jeśli żądanie na tę stronę generuje pliki cookie, będzie to coś do zbadania.

Za pomocą programu Fiddler można wyświetlić nagłówki HTTP wysyłane do klienta. Po przechwyceniu ruchu kliknij dwukrotnie żądanie, a następnie kliknij pozycję Nagłówki , aby wyświetlić nagłówek Set-Cookie. Jeśli pomyślnie zalogujesz się, w odpowiedzi na pomyślne zalogowanie zostanie wyświetlony nagłówek Set-Cookie.

Aby pobrać aplikację Fiddler, odwiedź następującą witrynę internetową skrzypka:

http://www.fiddlertool.com/fiddler/

Scenariusz 3


Po opuszczeniu klienta przez żądanie istnieją różne warstwy, które mogą mieć wpływ na wysyłane pakiety. Aby ustalić, czy urządzenie sieciowe usuwa plik cookie, należy przechwycić śledzenie sieci na kliencie i serwerze, a następnie sprawdzić treść żądania pliku cookie. Chcesz sprawdzić żądanie klienta, aby upewnić się, że plik cookie został wysłany, i sprawdzić śledzenie serwera, aby upewnić się, że serwer otrzymał plik cookie.

Żądanie

klienta Jest to żądanie GET po uwierzytelnieniu użytkownika. Informacje o biletach uwierzytelniania formularzy są wyróżnione kolorem niebieskim. Potwierdza to, że informacje o plikach cookie opuściły klienta. Gdy używasz narzędzia do przechwytywania sieci, takiego jak Netmon, widzisz ruch, który faktycznie przeszedł przez kartę.

47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local
68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61   gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63   spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c   cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53   che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30   PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36   C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46   9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35   51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46   81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34   24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39   B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46   9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43   BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46   2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65   4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62   =VisitorId=b24eb

Żądanie

po stronie serwera Gdy przyjrzysz się żądaniu, które dotarło do serwera, upewnij się, że serwer otrzymał te same informacje, które klient wysłał. Jeśli serwer nie otrzymał tych samych informacji, należy zbadać inne urządzenia w sieci, aby ustalić, gdzie plik cookie został usunięty.

Uwaga Wystąpiły również wystąpienia filtrów ISAPI usuwających pliki cookie. Jeśli potwierdzisz, że serwer sieci Web otrzymał plik cookie, ale plik cookie nie jest wymieniony w dziennikach IIS, sprawdź filtry ISAPI. Może być konieczne usunięcie filtrów w celu sprawdzenia, czy problem został rozwiązany.

Limit limitu czasu biletu uwierzytelniania formularzy

Inną częstą przyczyną przekierowania użytkownika jest wygaśnięcie biletu uwierzytelniania formularzy. Bilet uwierzytelniania formularzy może przekroczć limit czasu na dwa sposoby. Pierwszy scenariusz występuje, jeśli używasz wygaśnięcia bezwzględnego. Wraz z wygaśnięciem bezwzględnym bilet uwierzytelniania wygasa po upływie czasu wygaśnięcia. Na przykład ustawiono wygaśnięcie 20 minut, a użytkownik odwiedza witrynę o godzinie 14:00. Użytkownik zostanie przekierowany do strony logowania, jeśli użytkownik odwiedzi witrynę po godzinie 14:20.

Jeśli używasz przesuwania wygasania, scenariusz jest nieco bardziej skomplikowany. Plik cookie i wynikowy bilet zostaną zaktualizowane, jeśli użytkownik odwiedzi witrynę po upływie połowy czasu wygaśnięcia. Na przykład można ustawić wygaśnięcie 20 minut przy użyciu przesuwnych wygasania. Użytkownik odwiedza witrynę o godzinie 14:00, a użytkownik otrzymuje plik cookie, który ma wygasnąć o godzinie 14:20. Wygaśnięcie zostanie zaktualizowane tylko wtedy, gdy użytkownik odwiedzi witrynę po godzinie 14:10. Jeśli użytkownik odwiedzi witrynę o godzinie 14:09, bilet nie zostanie zaktualizowany, ponieważ połowa czasu wygaśnięcia nie minęła. Jeśli użytkownik odczeka 12 minut, odwiedzając witrynę o godzinie 14:21, bilet utraci ważność. Użytkownik jest przekierowywany na stronę logowania.

Jednym ze sposobów rozwiązania tego typu problemu jest zalogowanie pliku cookie uwierzytelniania formularzy i informacji o biletach. W ten sposób możesz sprawdzić, czy plik cookie został odebrany przez IIS i jakie są wartości. Możesz to zrobić, pisząc plik HttpModule, a następnie podłączając ten moduł do potoku żądania. Nie musisz modyfikować kodu aplikacji, aby uzyskać potrzebne informacje.

Dołączony przykład działa w programie Microsoft .NET Framework 1.1 i .NET Framework 2.0 i zawiera komentarze. W przykładzie znajdują się następujące pliki:

  • FormsAuthEvents.cs: Klasa, która implementuje IHttpModule i wiąże się ze zdarzeniem Application_BeginRequest.

  • FormsAuthInfo.cs: Klasa, która pobiera plik cookie i odszyfrowuje bilet uwierzytelniania formularzy. Sprawdza również plik Web.config aplikacji, aby upewnić się, że jest włączone uwierzytelnianie formularzy.

  • FormsAuthConfig.cs: Klasa, która odczytuje informacje z pliku FormsAuthLogger.config.

  • Log.cs: Plik, który akceptuje konstruktora ciągów i zapisuje wartości w pliku dziennika.

  • FormsAuthLogger.config: Plik XML odczytany przez plik Log.cs. Ten plik musi znajdować się w folderze /bin z wbudowaną biblioteką DLL. Plik umożliwia skonfigurowanie następujących elementów:

    • Filtruj według adresu IP: Przechwytywanie danych można filtrować według adresu IP klienta. W ten sposób można rejestrować tylko żądania od klienta, który jest znany w celu odtworzenia problemu. Spowoduje to zmniejszenie rozmiaru dziennika.

    • Typ przechwytywania: określa miejsce zapisywania pliku. Domyślnie jest to folder Pliki tymczasowe ASP.NET, ale można go zapisać w dowolnym miejscu, o ile konto procesu roboczego ma możliwość pisania w tym folderze.

Uwaga Udostępnię link pobierania kodu dostarczonego w pliku FormsAuthLogger.zip.

Wskażę tu główne obszary:

  1. Utwórz klasę, która implementuje interfejs IHttpModule.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. Zdejmij zdarzenie, które chcesz wyświetlić. W tym przykładzie używamy zdarzenia Application_BeginRequest. W ten sposób możemy zbadać każde żądanie i ustalić, czy zawiera ono plik cookie uwierzytelniania formularzy i zarejestrować formularzEuthenticationTicket, jeśli plik cookie tam jest.

    public void Init(HttpApplication application) 
    {
    //Wire up the BeginRequest event
    application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }
  3. Zaimplementuj zdarzenie Application_BeginRequest.

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. Pobierz plik cookie uwierzytelniania formularzy, a następnie odszyfruj go.

  5. Zarejestruj wartości. Polecam rejestrowanie następujących oprócz informacji formularzy. W razie potrzeby ułatwi to wyrównanie informacji uwierzytelniania formularzy do dzienników IIS:

    • Data: umożliwia sprawdzenie, kiedy żądanie przyszło.

    • Typ żądania: pokazuje, czy żądanie to Get, czy Post.

    • Adres URL: pokazuje wzorzec żądań prowadzących do problemu.

    • Referrer

    • ClientIP: powiązania w żądaniach do określonego klienta.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.

Społeczności pomagają zadawać i odpowiadać na pytania, przekazywać opinie i słuchać ekspertów z bogatą wiedzą.

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?
Jeśli naciśniesz pozycję „Wyślij”, Twoja opinia zostanie użyta do ulepszania produktów i usług firmy Microsoft. Twój administrator IT będzie mógł gromadzić te dane. Oświadczenie o ochronie prywatności.

Dziękujemy za opinię!

×