Accedi con Microsoft
Accedi o crea un account.
Salve,
Seleziona un altro account.
Hai più account
Scegli l'account con cui vuoi accedere.

Colonna vocale supporto ASP .NET

Risoluzione dei problemi relativi all'autenticazione dei moduli

Benvenuto nella colonna ASP.NET Support Voice. Mi chiamo Jerry Orman. Lavoro con Microsoft da oltre 5 anni e ho dedicato la maggior parte del mio tempo a tecnologie correlate al Web come Microsoft FrontPage e le nuove tecnologie Microsoft SharePoint. L'ultimo anno ho lavorato con Microsoft ASP.NET come tecnico del supporto tecnico. Questo mese, nella colonna Support Voice, spiegherò come risolvere i problemi relativi all'autenticazione forms in Microsoft ASP.NET.

Risoluzione dei problemi relativi all'autenticazione dei moduli

Quando si usa autenticazione forms in un'applicazione di ASP.NET, potrebbe essere necessario risolvere un problema che si verifica quando l'utente viene reindirizzato casualmente alla pagina di accesso. In un mondo ideale, questo problema si verificherebbe in un modo che consenta di collegare facilmente un debugger e catturare il problema. Negli ambienti di produzione, tuttavia, questo è raramente il caso. Per risolvere un problema casuale come questo, è necessario registrare le informazioni correlate al problema in modo da limitare la causa principale.

In questa colonna verrà trattato brevemente il concetto di autenticazione basata su moduli. Esamineremo quindi gli scenari in cui un utente viene reindirizzato alla pagina di accesso e come acquisire i dati rilevanti per isolare il problema. Verrà inoltre illustrato come implementare un'interfaccia IHttpModule per registrare le informazioni di autenticazione forms.

Panoramica dell'autenticazione dei moduli

Quando un utente esegue l'autenticazione in un sito Web tramite Autenticazione forms, il server crea un cookie. Il valore del cookie è un ticket di autenticazione forms crittografato. Il cookie viene passato al server in ogni richiesta all'applicazione e la classe FormsAuthenticationModule decrittografa il valore del cookie e determina se l'utente è valido o meno.

Per impostazione predefinita, la classe FormsAuthenticationModule viene aggiunta nel file di Machine.config. La classe FormsAuthenticationModule gestisce il processo FormsAuthentication.

Di seguito è riportata una voce del file Machine.config:

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

Il traffico HTTP generale per l'autenticazione tramite Autenticazione moduli è simile al seguente:

  1. Il client invia un HTTP GET a Default.aspx. Non viene inviato alcun cookie di autenticazione forms.

  2. Il server invia una risposta 302 (reindirizzamento) a Login.aspx.

  3. Il client invia un POST HTTP a Login.aspx. Include le informazioni di accesso.

  4. Il server invia una risposta 302 (reindirizzamento) a Default.aspx. Il cookie di autenticazione forms è incluso.

  5. Il client invia un HTTP GET a Default.aspx. Questo include il cookie di autenticazione forms.

Per ulteriori informazioni sull'implementazione e l'utilizzo dell'autenticazione forms, visitare i seguenti siti 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).aspxPer altre informazioni sulla condivisione dei cookie di autenticazione dei moduli, visitare il seguente sito Web ASP.NET:

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

Motivi per cui un utente può essere reindirizzato alla pagina di accesso

Il cookie di autenticazione forms viene perso

Scenario 1


In questo scenario, un utente accede al sito Web. A un certo punto, il client invia una richiesta al server e il
FormsAuthenticationModule classe non riceve il cookie. È possibile determinare se una richiesta utente non contiene il cookie abilitando la registrazione dei cookie in Microsoft Internet Information Services (IIS). A tale scopo, procedere come segue:

  1. Aprire Microsoft Management Console (MMC) di IIS.

  2. Fare clic con il pulsante destro del mouse sul sito Web e quindi scegliere
    Proprietà.

  3. Fare clic sulla scheda Sito Web e quindi su Abilita registrazione.

  4. Verificare che il formato del log sia W3C Extended Log File Format.

  5. Fare clic su Proprietà.

  6. Fare clic sulla scheda Avanzate e quindi su
    Proprietà estese.

  7. In Proprietà estese fai clic per selezionare la casella di controllo Cookie(cs(Cookie)) e la casella di controllo Referer (cs(Referer)).

Dopo che si è verificato questo problema, determinare quale client ha avuto il problema e l'indirizzo IP del client. Filtrare il log di IIS sull'indirizzo IP del client e visualizzare la colonna <cookie>.

Nota È possibile usare Log Parser per analizzare i log di IIS. Per scaricare Log Parser, visitare il seguente sito Web Microsoft:

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 Dopo avere visualizzato l'elenco delle richieste di quell'utente specifico, cercare le richieste nella pagina di accesso. Si sa che sono stati reindirizzati a questa pagina e si vogliono visualizzare le richieste prima del reindirizzamento. Se viene visualizzato qualcosa di simile al seguente, il client non ha inviato il cookie o il cookie è stato rimosso nella rete tra il client e il server.

Questo è l'accesso iniziale.

Metodo

Pagina

Risposta

Cookie

OTTIENI

/Aspx

302 (Reindirizzamento)

Nessun cookie

OTTIENI

/Aspx

200 (Success)

Nessun cookie

INSERISCI

/Aspx

302 (Reindirizzamento)

Nessun cookie

OTTIENI

/Aspx

200 (Success)

. ASPXAUTH

OTTIENI

/SomePage.aspx

302 (Reindirizzamento)

No. ASPXAUTH Cookie

Si tratta di altre richieste, seguite da una richiesta a una pagina del sito senza . Cookie ASPXAUTH.

Metodo

Pagina

Risposta

Cookie

OTTIENI

/SomePage.aspx

302 (Reindirizzamento)

No. ASPXAUTH Cookie

OTTIENI

/Aspx

200 (Success)

No. ASPXAUTH Cookie

INSERISCI

/Aspx

302 (Reindirizzamento)

No. ASPXAUTH Cookie

OTTIENI

/SomePage.aspx

200 (Success)

. ASPXAUTH


Nota: la prima richiesta da parte dell'utente non è probabile che disponga di un cookie di autenticazione forms a meno che non si crei un cookie persistente. Nel log IIS verranno visualizzati solo i cookie ricevuti nella richiesta. La prima richiesta di avere il cookie di autenticazione forms sarà nella richiesta dopo un tentativo di accesso riuscito.

Scenario 2


Il cookie di autenticazione di forms può anche andare perso quando viene superato il limite di cookie del client. In Microsoft Internet Explorer è previsto un limite di 20 cookie. Dopo la creazione del 20° cookie nel client, i cookie precedenti vengono rimossi dalla raccolta del client. Se il . Il cookie ASPXAUTH viene rimosso, l'utente verrà reindirizzato alla pagina di accesso al momento dell'elaborazione della successiva richiesta.

È possibile risolvere questi due scenari nello stesso modo. Esaminare la richiesta appena prima del reindirizzamento alla pagina di accesso. Se la richiesta a questa pagina genera cookie, questo sarà un elemento da analizzare.

È possibile usare Fiddler per visualizzare le intestazioni HTTP inviate al client. Dopo aver acquisito il traffico, fare doppio clic su una richiesta e quindi su Intestazioni per visualizzare l'intestazione Set-Cookie. Se si traccia un accesso riuscito, verrà visualizzata l'intestazione Set-Cookie in risposta a un accesso riuscito.

Per scaricare Fiddler, visita il seguente sito Web Fiddler:

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

Scenario 3


Dopo che la richiesta lascia il client, ci sono vari livelli che possono influire sui pacchetti che vengono inviati. Per determinare se un dispositivo di rete sta rimuovendo il cookie, è necessario acquisire una traccia di rete sul client e sul server e quindi cercare nel corpo della richiesta per il cookie. Si desidera esaminare la richiesta del client per assicurarsi che il cookie sia stato inviato e controllare la traccia del server per assicurarsi che il server abbia ricevuto il cookie.

Richiesta

client Si tratta di una richiesta GET dopo l'autenticazione dell'utente. Le informazioni sui ticket di autenticazione dei moduli sono evidenziate in blu. Ciò conferma che le informazioni sui cookie hanno lasciato il client. Quando usi uno strumento di acquisizione di rete, come Netmon, viene visualizzato il traffico effettivamente attraversato dall'adattatore.

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

Richiesta

lato server Quando si esamina la richiesta che ha raggiunto il server, è necessario assicurarsi che il server abbia ricevuto le stesse informazioni inviate dal client. Se il server non ha ricevuto le stesse informazioni, è necessario analizzare altri dispositivi in rete per determinare dove è stato rimosso il cookie.

Nota Ci sono state anche istanze di filtri ISAPI che rimuovono i cookie. Se si conferma che il server Web ha ricevuto il cookie, ma il cookie non è elencato nei log di IIS, controllare i filtri ISAPI. Potrebbe essere necessario rimuovere i filtri per verificare se il problema è stato risolto.

Timeout del ticket di autenticazione dei moduli

L'altra causa comune per cui un utente deve essere reindirizzato è se il ticket di autenticazione forms è scaduto. Il timeout del ticket di autenticazione dei moduli può essere effettuato in due modi. Il primo scenario si verifica se si usa una scadenza assoluta. Con una scadenza assoluta, il ticket di autenticazione scade alla scadenza del periodo di scadenza. Ad esempio, si imposta una scadenza di 20 minuti e un utente visita il sito alle 14.00. L'utente verrà reindirizzato alla pagina di accesso se visita il sito dopo le 14.20.

Se usi la scadenza scorrevole, lo scenario è un po' più complicato. Il cookie e il ticket risultante vengono aggiornati se l'utente visita il sito dopo la mezza scadenza. Ad esempio, è possibile impostare una scadenza di 20 minuti usando la scadenza scorrevole. Un utente visita il sito alle 14:00 e riceve un cookie che scadrà alle 14.20. La scadenza viene aggiornata solo se l'utente visita il sito dopo le 14.10. Se l'utente visita il sito alle 14:09, il ticket non viene aggiornato perché metà della scadenza non è passata. Se l'utente attende 12 minuti, visitando il sito alle 14.21, il ticket sarà scaduto. L'utente viene reindirizzato alla pagina di accesso.

Un modo per affrontare questo tipo di problema consiste nel registrare le informazioni sui cookie di autenticazione dei moduli e sui ticket. In questo modo, è possibile verificare se il cookie è stato ricevuto da IIS e quali sono i valori. È possibile farlo scrivendo un HttpModule e quindi collegando tale modulo nella pipeline della richiesta. Non sarà necessario modificare il codice dell'applicazione per ottenere le informazioni necessarie.

L'esempio allegato funziona in Microsoft .NET Framework 1.1 e .NET Framework 2.0 e contiene commenti in tutto. L'esempio include i file seguenti:

  • FormsAuthEvents.cs: classe che implementa IHttpModule e collegamenti all'evento Application_BeginRequest.

  • FormsAuthInfo.cs: classe che recupera il cookie e decrittografa il ticket di autenticazione forms. Controlla anche il file di Web.config dell'applicazione per verificare che l'autenticazione forms sia abilitata.

  • FormsAuthConfig.cs: classe che legge le informazioni del file FormsAuthLogger.config.

  • Log.cs: Il file che accetta un stringbuilder e scrive i valori in un file di log.

  • FormsAuthLogger.config: il file XML letto dal file Log.cs. Questo file deve trovarsi nella cartella /bin con la DLL compilata. Il file consente di configurare quanto segue:

    • Filtra per IP: è possibile filtrare l'acquisizione dei dati in base all'IP del client. In questo modo, è possibile registrare solo le richieste provenienti da un client noto per riprodurre il problema. In questo modo si riducono le dimensioni del log.

    • Tipo di acquisizione: specifica dove salvare il file. L'impostazione predefinita è la cartella File di ASP.NET temporanei, ma è possibile salvarla ovunque, purché l'account del processo di lavoro abbia la possibilità di scrivere nella cartella.

Nota: fornisco un collegamento per il download del codice fornito nel file di FormsAuthLogger.zip.

Vi faccio notare le aree principali qui:

  1. Creare una classe che implementa l'interfaccia IHttpModule.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. Collega l'evento che vuoi esaminare. In questo esempio viene usato l'evento Application_BeginRequest. In questo modo è possibile esaminare ogni richiesta e determinare se dispone del cookie di autenticazione forms e registrare FormsAuthenticationTicket se il cookie è presente.

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

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. Recuperare il cookie di autenticazione di forms e decrittografarlo.

  5. Registrare i valori. Consiglierei di registrare quanto segue oltre alle informazioni sui moduli. In questo modo sarà possibile allineare le informazioni di autenticazione dei moduli ai log di IIS, se necessario:

    • Data: consente di vedere quando è stata inviata la richiesta.

    • RequestType: indica se la richiesta è un oggetto Get o un Post.

    • URL: mostra il modello di richieste che causano il problema.

    • Referrer

    • ClientIP: legami nelle richieste a un cliente specifico.

Serve aiuto?

Vuoi altre opzioni?

Esplorare i vantaggi dell'abbonamento e i corsi di formazione, scoprire come proteggere il dispositivo e molto altro ancora.

Le community aiutano a porre e a rispondere alle domande, a fornire feedback e ad ascoltare gli esperti con approfondite conoscenze.

Queste informazioni sono risultate utili?

Come valuti la qualità della lingua?
Cosa ha influito sulla tua esperienza?
Premendo Inviare, il tuo feedback verrà usato per migliorare i prodotti e i servizi Microsoft. L'amministratore IT potrà raccogliere questi dati. Informativa sulla privacy.

Grazie per il feedback!

×