2013-03-04 13 views
5

Sto leggendo i sorgenti .NET4 (possono essere scaricati gratuitamente per la ricerca) e ho trovato qualcosa di strano nell'implementazione di System.Web.Security.FormsAuthenticationModule.Come si suppone che questo codice in FormsAuthenticationModule funzioni?

La classe è dichiarata in questo modo:

public sealed class FormsAuthenticationModule : IHttpModule 

dove IHttpModule ha due metodi - Init() e Dispose().

All'interno OnEnter() ci sei queste righe:

// Step 2: Call OnAuthenticate virtual method to create 
// an IPrincipal for this request 
OnAuthenticate(new FormsAuthenticationEventArgs(context)); 

dove OnAuthenticate() è dichiarato come questo:

// OnAuthenticate: Forms Authentication modules can override 
//    this method to create a Forms IPrincipal object from 
//    a WindowsIdentity 
private void OnAuthenticate(FormsAuthenticationEventArgs e) { 

Ora la classe è sealed, quindi è impossibile ereditare da. Anche OnAuthenticate() non è virtual quindi non vedo come avrebbe potuto essere comunque sovrascritto.

Quindi sembra che questi commenti siano appena superati e che la sostituzione di OnAuthenticate() non sia più possibile.

Ho sbagliato qualcosa? Questo codice potrebbe consentire la sostituzione di OnAuthenticate()?

+0

AFAIU Questa classe è sigillata proprio dal [inizio] (http://msdn.microsoft.com/ us/library/system.web.security.formsauthenticationmodule (v = vs.71) .aspx) –

+1

Dal nome e dai parametri segue che questo è un '' evento trigger '' (http://stackoverflow.com/a/ 2448530/60761), dovrebbero normalmente essere virtuali. Questo ovviamente è in conflitto con il sigillato. Nel peggiore dei casi una classe potrebbe iscriversi ai propri eventi. –

risposta

1

Non funziona. È semplicemente una documentazione errata. Non è la prima volta per la SM. Per esempio, ho avvertito MS su questo di nuovo nella versione 1.1 del .NET Framework e qui siamo a 4,5 e non c'è documentazione è ancora totalmente fuorviante: http://msdn.microsoft.com/en-us/library/7he0a7s1.aspx

noti il ​​"Note per gli eredi" sezione. In che modo qualcuno dovrebbe derivare una classe da BindingManagerBase quando contiene diverse proprietà e metodi internal abstract? Eppure ci sono diversi punti nella documentazione di BindingManagerBase e CurrencyManager che hanno "Note per gli eredi" ...

Problemi correlati