39


AuthenticateRequest wydarzenie

Q 1. Do mojego zrozumienia FormsAuthenticationModule subskrybuje AuthenticateRequest imprezy, a więc tylko po to zdarzenie zostanie zwolniony, to FormsAuthenticationModule nazywa. Ale poniższe cytaty dostał mnie nieco mylić:

  1. W AuthenticateRequest sygnały przypadku, gdy skonfigurowany mechanizm uwierzytelniania został uwierzytelnione bieżącego żądania.

    • Czyż powyższy cytat sugerują, że kiedy AuthenticateRequest zdarzenie jest wywoływane, prośba (aka użytkownika) jest już poświadczone?
  2. Zapisywanie w przypadku AuthenticateRequest zapewnia, że ​​żądanie zostanie uwierzytelniony przed przetwarzaniem lub dołączony moduł obsługi zdarzeń.

    • O ile mi zrozumieć ten cytat, jeśli subskrybować AuthenticatedRequest, to nasza obsługi zdarzeń zostanie wywołana przed FormsAuthenticationModule? W ten sposób Application_AuthenticateRequest() zostanie wywołany przed wywołaniem FormsAuthenticationModule?


Q 2. Book uczę od sugeruje, że w ciągu Application_AuthenticateRequest() jesteśmy w stanie zweryfikować, czy użytkownik jest członkiem określonej roli, a jeśli nie, możemy dodać użytkownika automatycznie:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
      if (User.Identity.IsAuthenticated && Roles.Enabled) 
      { 

       //here we can subscribe user to a role via Roles.AddUserToRole() 
      }  
    } 

Sądząc po powyższym kodzie Application_AuthenticateRequest() nazywa po FormsAuthenticationModule została wywołana, ale gdzieś indziej sama książka sugeruje, że Application_AuthenticateRequest() nazywa się przed FormsAuthenticationModule:

Application_AuthenticateRequest nazywa się tuż przed wykonywana jest autoryzacja. To jest punkt wyjścia do tworzenia własnej logiki uwierzytelniania.


Czego mi brakuje?


Niż

Odpowiedz

50

Wydaje się, że FormsAuthenticationModule dostaje obsługiwane w pierwszej kolejności. Ten moduł jest zwykle wcześniejszy niż dowolny niestandardowy moduł w potoku ASP.NET, więc kiedy AuthenticateRequest zostanie uruchomiony, FormsAuthenticationModule zostanie wywołany jako pierwszy, wykona swoje zadanie, a następnie zostanie wywołany moduł obsługi zdarzeń twojego modułu.

Jeśli naprawdę chcesz w to głęboko zagłębić, sugeruję próbę samodzielnego debugowania kodu ASP.NET.Oto post jak skonfigurować VS:

http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx

EDIT: Udało mi się potwierdzić ten problem poprzez stworzenie projektu internetowego z modułem zwyczaj i obsługą zdarzeń w Global.asax. Spójrz na kodzie źródłowym HttpApplication.InitInternal kolejność inicjalizacji jest następujący:

  • inicjalizacji zintegrowanych modułów: FormsAuthenticationModule haki do HttpApplication.AuthenticateRequest wydarzenie
  • inicjalizacji niestandardowych modułów: Moduł niestandardowy haki do HttpApplication.AuthenticateRequest imprezy
  • inicjalizacji Global klasy (global.asax): tu podłączyć do zdarzenia AuthenticateRequest
  • HttpApplication.InitInternal wyszukuje sposobów na globalnej klasy po nazwie określonego wzoru (np Application_AuthenticateRequest), Dopasowuje je do wydarzenia i haki

Po inicjalizacji, gdy pożary AuthenticateRequest, obsługi zdarzeń są wywoływane w kolejności ich gdzie zainicjowany, więc:

  • FormsAuthenticationModule.AuthenticateRequest obsługi zdarzeń
  • CustomModule.AuthenticateRequest obsługi zdarzeń
  • Global.AuthenticateRequest obsługi zdarzeń sposób
  • Global.Application_AuthenticateRequest

O ile nie przeoczyłem czegoś, nie ma mechanizmu zatrzymywania programów obsługi zdarzeń na ogień, więc niezależnie od wyniku FormsAuthenticationModule.AuthenticateRequest, nadal będą wywoływane kolejne programy obsługi. Mam nadzieję że to pomogło.

+0

Q1 Jeśli rozumiem zostanie poprawnie, a następnie, gdy pożary AuthenticateRequest, FormsAuthenticationModule nazywa się pierwszy, potem Application_AuthenticateRequest(), a dopiero potem są nazywa się niestandardowe moduły uwierzytelniające? Q2 - Ale co z cytatem MSDN ("Zdarzenie AuthenticateRequest sygnalizuje, że skonfigurowany mechanizm uwierzytelniania uwierzytelnił bieżące żądanie"), co oznacza, że ​​AuthenticateRequest jest uruchamiany dopiero po wykonaniu zadania FormsAuthenticationModule? – SourceC

+1

Szczegółowa odpowiedź w poście. Jeśli chodzi o Q2 - to chyba nie jest do końca prawdą: "Zdarzenie AuthenticateRequest sygnalizuje, że skonfigurowany mechanizm uwierzytelniania uwierzytelnił bieżące żądanie" - z pewnością przeszedł procedurę obsługi zdarzeń w FormsAuthenticationModule, ale nie znamy wyniku;) – bbmud

+1

thanx. Naprawdę pomogłeś mi z tym – SourceC

5

Jeśli chcesz otrzymać dostęp do obiektu użytkownika, sugeruję użyć

protected void Application_Start() 
{ 
    PostAuthenticateRequest += Application_PostAuthenticateRequest; 
} 

protected void Application_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if(User.Identity.IsAuthenticated) 
    { 
     //Do stuff here 
    } 
}