Iniciar sesión con Microsoft
Iniciar sesión o crear una cuenta
Hola:
Seleccione una cuenta diferente.
Tiene varias cuentas
Elija la cuenta con la que desea iniciar sesión.

Columna de voz de soporte técnico de ASP .NET

Solución de problemas de autenticación de formularios

Bienvenido a la columna Support Voice de ASP.NET. Me llamo Jerry Orman. He estado con Microsoft durante más de 5 años y he dedicado la mayor parte de mi tiempo a tecnologías relacionadas con la Web, como Microsoft FrontPage y las nuevas tecnologías de Microsoft SharePoint. He pasado el último año trabajando con Microsoft ASP.NET como ingeniero de soporte técnico. Este mes, en la columna Voz de soporte técnico, voy a explicar cómo solucionar problemas de autenticación de formularios en Microsoft ASP.NET.

Solución de problemas de autenticación de formularios

Al usar la autenticación de formularios en una aplicación de ASP.NET, es posible que considere necesario solucionar un problema que se produzca cuando el usuario se redirige aleatoriamente a la página de inicio de sesión. En un mundo ideal, este problema se producía de una manera que te permitiría conectar fácilmente un depurador y capturar el problema. En los entornos de producción, sin embargo, esto rara vez es el caso. Para solucionar un problema aleatorio como este, necesita registrar información relacionada con el problema para que pueda limitar la causa raíz.

En esta columna, explicaremos brevemente el concepto de autenticación de formularios. A continuación, analizaremos qué escenarios conducen a que un usuario sea redirigido a la página de inicio de sesión y cómo capturar datos relevantes para aislar el problema. También explicaremos cómo implementar una interfaz IHttpModule para registrar la información de autenticación de formularios.

Información general sobre autenticación de formularios

Cuando un usuario se autentica en un sitio web mediante la autenticación de formularios, el servidor crea una cookie. El valor de la cookie es un vale de autenticación de formularios cifrados. La cookie se pasa al servidor en cada solicitud a la aplicación, y la clase FormsAuthenticationModule descifra el valor de la cookie y determina si el usuario es válido o no.

De forma predeterminada, la clase FormsAuthenticationModule se agrega al archivo Machine.config. La clase FormsAuthenticationModule administra el proceso FormsAuthentication.

A continuación se muestra una entrada del archivo de Machine.config:

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

El tráfico HTTP general para autenticar mediante autenticación de formularios es similar al siguiente:

  1. El cliente envía un HTTP GET a Default.aspx. No se envía ninguna cookie de autenticación de formularios.

  2. El servidor envía una respuesta 302 (redirección) a Login.aspx.

  3. El cliente envía un HTTP POST a Login.aspx. Incluye la información de inicio de sesión.

  4. El servidor envía una respuesta 302 (redirección) a Default.aspx. Se incluye la cookie de autenticación de formularios.

  5. El cliente envía un HTTP GET a Default.aspx. Esto incluye la cookie de autenticación de formularios.

Para obtener más información sobre cómo implementar y usar la autenticación de formularios, visite los siguientes sitios web de 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).aspxPara obtener más información sobre cómo compartir cookies de autenticación de formularios, visite el siguiente ASP.NET sitio web:

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

Razones por las que un usuario puede ser redirigido a la página de inicio de sesión

La cookie de autenticación de formularios se pierde

Situación 1


En este escenario, un usuario inicia sesión en el sitio web. En algún momento, el cliente envía una solicitud al servidor y el
FormsAuthenticationModule clase no recibe la cookie. Puede determinar si una solicitud de usuario no contiene la cookie habilitando el registro de cookies en Microsoft Internet Information Services (IIS). Para ello, siga estos pasos:

  1. Abra la Consola de administración de Microsoft (MMC) de IIS.

  2. Haga clic con el botón secundario en el sitio web y, a continuación, haga clic en
    Propiedades.

  3. Haga clic en la pestaña Sitio web y, a continuación, haga clic en Habilitar registro.

  4. Asegúrese de que el formato de registro sea W3C Extended Log File Format.

  5. Haga clic en Propiedades.

  6. Haga clic en la pestaña Avanzadas y, a continuación, haga clic en
    Propiedades extendidas.

  7. En Propiedades extendidas, haga clic para seleccionar la casilla Cookie(cs(Cookie)) y la casilla Referencia (cs(Referer) ).

Después de que se produzca este problema, determine qué cliente tenía el problema y la dirección IP de ese cliente. Filtre el registro de IIS en la dirección IP del cliente y vea la columna> cookie de <.

Nota Puede utilizar el Analizador de registros para analizar los registros de IIS. Para descargar el Analizador de registros, visite el siguiente sitio web de Microsoft:

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 Una vez que tenga la lista de solicitudes de ese usuario específico, busque las solicitudes a la página de inicio de sesión. Sabe que se les redirigió a esta página y desea ver las solicitudes antes de que se produjera el redireccionamiento. Si ve algo similar a lo siguiente, el cliente no envió la cookie o la cookie se eliminó en la red entre el cliente y el servidor.

Este es el inicio de sesión inicial.

Método

Página

Respuesta

Cookies

OBTENER

/Default.aspx

302 (Redirección)

Sin cookies

OBTENER

/Login.aspx

200 (Éxito)

Sin cookies

EXPONER

/Login.aspx

302 (Redirección)

Sin cookies

OBTENER

/Default.aspx

200 (Éxito)

. ASPXAUTH

OBTENER

/SomePage.aspx

302 (Redirección)

No. ASPXAUTH Cookie

Estas son otras solicitudes, seguidas de una solicitud a una página del sitio sin la . Cookie ASPXAUTH.

Método

Página

Respuesta

Cookies

OBTENER

/SomePage.aspx

302 (Redirección)

No. ASPXAUTH Cookie

OBTENER

/Login.aspx

200 (Éxito)

No. ASPXAUTH Cookie

EXPONER

/Login.aspx

302 (Redirección)

No. ASPXAUTH Cookie

OBTENER

/SomePage.aspx

200 (Éxito)

. ASPXAUTH


Nota La primera solicitud de ese usuario no es probable que tenga una cookie de autenticación de formularios a menos que esté creando una cookie persistente. El registro de IIS solo le mostrará las cookies recibidas en la solicitud. La primera solicitud para tener la cookie de autenticación de formularios estará en la solicitud después de un intento de inicio de sesión correcto.

Situación 2


La cookie de autenticación de formularios también se puede perder cuando se supera el límite de cookies del cliente. En Microsoft Internet Explorer, hay un límite de 20 cookies. Una vez creada la cookie número 20 en el cliente, las cookies anteriores se eliminan de la recopilación del cliente. Si el valor de . Se elimina la cookie ASPXAUTH, el usuario será redirigido a la página de inicio de sesión cuando se procese la siguiente solicitud.

Puede solucionar estos dos escenarios de la misma manera. Mire la solicitud justo antes del redireccionamiento a la página de inicio de sesión. Si la solicitud a esta página genera cookies, será algo a investigar.

Puede usar Fiddler para ver los encabezados HTTP que se envían al cliente. Después de capturar el tráfico, haga doble clic en una solicitud y, a continuación, haga clic en Encabezados para ver el encabezado de Set-Cookie. Si realiza el seguimiento de un inicio de sesión correcto, verá el encabezado de Set-Cookie en la respuesta de un inicio de sesión correcto.

Para descargar Fiddler, visite el siguiente sitio web de Fiddler:

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

Escenario 3


Después de que la solicitud abandone el cliente, hay varias capas que pueden afectar a los paquetes que se envían. Para determinar si un dispositivo de red está quitando la cookie, tiene que capturar un seguimiento de red en el cliente y el servidor y, a continuación, buscar en el cuerpo de la solicitud de la cookie. Desea ver la solicitud del cliente para asegurarse de que se envió la cookie y comprobar el seguimiento del servidor para asegurarse de que el servidor ha recibido la cookie.

Solicitud

de cliente Esta es una solicitud GET después de autenticar al usuario. La información del vale de autenticación de formularios se resalta en azul. Esto confirma que la información de la cookie dejó al cliente. Cuando usas una herramienta de captura de red, como Netmon, ves el tráfico que realmente pasó por el adaptador.

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

Solicitud

del lado servidor Cuando observa la solicitud que ha llegado al servidor, desea asegurarse de que el servidor ha recibido la misma información que envió el cliente. Si el servidor no recibió la misma información, deberá investigar otros dispositivos de la red para determinar dónde se quitó la cookie.

Nota También se han producido casos de filtros ISAPI quitando cookies. Si confirma que el servidor web ha recibido la cookie, pero la cookie no aparece en los registros de IIS, compruebe los filtros ISAPI. Es posible que tenga que quitar los filtros para ver si se resuelve el problema.

Se agota el tiempo de salida del vale de autenticación de formularios

La otra causa común para redirigir a un usuario es si el vale de autenticación de formularios ha expirado. El vale de autenticación de formularios puede agotar el tiempo de salida de dos maneras. El primer escenario se produce si usa una expiración absoluta. Con expiración absoluta, el vale de autenticación expira cuando expira el tiempo de expiración. Por ejemplo, establece una expiración de 20 minutos y un usuario visita el sitio a las 14:00. El usuario será redirigido a la página de inicio de sesión si el usuario visita el sitio después de las 2:20 p.m.

Si utiliza la expiración variable, el escenario es un poco más complicado. La cookie y el vale resultante se actualizan si el usuario visita el sitio después de que la fecha de expiración esté a mitad de expiración. Por ejemplo, puede establecer una expiración de 20 minutos deslizando la expiración. Un usuario visita el sitio a las 14:00 y recibe una cookie que está configurada para expirar a las 14:20. La expiración solo se actualiza si el usuario visita el sitio después de las 2:10 p.m. Si el usuario visita el sitio a las 2:09 p.m., el vale no se actualiza porque no ha pasado la mitad del tiempo de expiración. Si el usuario espera 12 minutos y visita el sitio a las 2:21 p.m., el billete expirará. El usuario se redirige a la página de inicio de sesión.

Una manera de abordar este tipo de problema es registrar la cookie de autenticación de formularios y la información del vale. De esta forma, puede ver si IIS ha recibido la cookie y cuáles son los valores. Para ello, escriba un HttpModule y, a continuación, conecte ese módulo a la canalización de solicitudes. No tendrá que modificar el código de la aplicación para obtener la información que necesita.

El ejemplo adjunto funciona en Microsoft .NET Framework 1.1 y .NET Framework 2.0 y tiene comentarios en todo el documento. En el ejemplo se incluyen los siguientes archivos:

  • FormsAuthEvents.cs: La clase que implementa IHttpModule y los vínculos en el evento Application_BeginRequest.

  • FormsAuthInfo.cs: La clase que recupera la cookie y descifra el vale de autenticación de formularios. También comprueba el archivo Web.config de la aplicación para asegurarse de que está habilitada la autenticación de formularios.

  • FormsAuthConfig.cs: la clase que lee la información del archivo FormsAuthLogger.config.

  • Log.cs: El archivo que acepta un stringbuilder y escribe los valores en un archivo de registro.

  • FormsAuthLogger.config: El archivo XML que lee el archivo Log.cs. Este archivo tiene que estar en la carpeta /bin con la DLL compilada. El archivo le permite configurar lo siguiente:

    • Filtrar por IP: Puede filtrar la captura de datos por IP del cliente. De esta forma, solo puede registrar las solicitudes de un cliente que se sabe que reproduce el problema. Esto reduce el tamaño del registro.

    • Tipo de captura: especifica dónde guardar el archivo. El valor predeterminado es la carpeta Archivos ASP.NET temporales, pero puede guardarlo en cualquier lugar siempre que la cuenta del proceso de trabajo tenga la capacidad de escribir en la carpeta.

Nota Proporcionaré un vínculo de descarga para el código proporcionado en el archivo FormsAuthLogger.zip.

Voy a señalar las áreas principales aquí:

  1. Cree una clase que implemente la interfaz IHttpModule.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. A wire up the event you want to look at. En este ejemplo, usamos el evento de Application_BeginRequest. De esta forma, podemos investigar cada solicitud y determinar si tiene la cookie de autenticación de formularios y registrar formsAuthenticationTicket si la cookie está allí.

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

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. Recupere la cookie de autenticación de formularios y descifra la cookie.

  5. Registre los valores. Recomiendo el registro de lo siguiente, además de la información de los formularios. Esto le ayudará a alinear la información de autenticación de formularios con los registros de IIS, si es necesario:

    • Fecha: permite ver cuándo llegó la solicitud.

    • RequestType: muestra si la solicitud es Get o Post.

    • URL: muestra el patrón de solicitudes que conducen al problema.

    • Referente

    • ClientIP: vincula las solicitudes a un cliente específico.

¿Necesita más ayuda?

¿Quiere más opciones?

Explore las ventajas de las suscripciones, examine los cursos de aprendizaje, aprenda a proteger su dispositivo y mucho más.

Las comunidades le ayudan a formular y responder preguntas, enviar comentarios y leer a expertos con conocimientos extensos.

¿Le ha sido útil esta información?

¿Cuál es tu grado de satisfacción con la calidad del lenguaje?
¿Qué ha afectado a su experiencia?
Si presiona Enviar, sus comentarios se usarán para mejorar los productos y servicios de Microsoft. El administrador de TI podrá recopilar estos datos. Declaración de privacidad.

¡Gracias por sus comentarios!

×