2012-04-17 22 views
9

Después de verificar las credenciales de un usuario y confirmar que son buenas, estoy usando FormsAuthentication.SetAuthCookie("Username", false); para autenticar al usuario.¿FormsAuthentication.SetAuthCookie() requiere una redirección?

En la página maestra utilizo Page.User.Identity.IsAuthenticated para asegurarme de que estamos tratando con un usuario que ha iniciado sesión y no un invitado.

El problema está en establecer primero la cookie de autenticación. Cuando configuro la cookie de autenticación, inmediatamente después ejecuto un método que usa Page.User.Identity.IsAuthenticated para cambiar el mensaje de bienvenida de un "Bienvenido, invitado" genérico. mensaje a un "Bienvenido, nombre de usuario" más personal mensaje. Esto no funciona hasta que voy a otra página, así que sé que el proceso de inicio de sesión ha funcionado, pero parece que no puedo acceder a la información que necesito hasta que ocurre una actualización o una redirección.

¿Debo redirigir al usuario después de configurar la cookie de autenticación para usar el Page.User.Identity.IsAuthenticated para cambiar el mensaje?

Respuesta

6

Lo he visto antes, así que sé que la respuesta es sí. (Al igual que en, sí sí es necesario para redirigir al usuario a utilizar correctamente Page.User.Identity.IsAuthenticated)

lo que imagino es la causa se debe a IsAuthenticated evalúa la solicitud actual, y cuando la solicitud actual entró por primera vez en que se registró como no autenticado.

Lo que tendrá que hacer es aplicar cualquier lógica que tenga en dicho método sin la verificación de IsAuthenicated (haga que asuma la verdad).

Ahora no conozco los detalles de su método como para sugerir cómo volver a factorizarlo para hacer frente a esto, pero podría dividir la parte "Do Stuff" en una función separada que luego podría llamar directamente de su función de inicio de sesión para eludir la verificación de autenticación.


EDITAR: Para una copia de seguridad de mi suposición de que pueda read this page.

La parte interesante:

los suministros de billetes formas de autenticación de formularios de autenticación de información a la siguiente petición hecha por el navegador.

+0

Ah, parece que en efecto ser el caso, entonces, gracias por su respuesta! Supongo que podría simplemente redirigir al usuario después de la autenticación, entonces no tendría que molestarme en escribir una solución para completar el mensaje de bienvenida la primera vez. –

+0

@SgtBeardy: Sí, una redirección me parece una solución lo suficientemente buena – musefan

3

Me gustaría señalar que hay una forma de evitar esto (ya que nunca he visto esto en otra pregunta como esta). Puede recuperar la cookie y sus datos de donde proviene la información de User.Identity sin una redirección. La cuestión es que la cookie aún no se ha enviado al navegador.

Simplemente recupera el galleta hecha por FormsAuthentication de los Response.Cookies objeto:

HttpCookie EncryptedCookie = Response.Cookies.Get(FormsAuthentication.FormsCookieName); 
FormsAuthenticationTicket DecryptedCookie; 
try { 
    DecryptedCookie = FormsAuthentication.Decrypt(EncryptedCookie.Value); 
} catch (ArgumentException) { 
    // Not a valid cookie 
    return false; 
} 
// DecryptedCookie.Name: The Username 
// DecryptedCookie.UserData: Any additional data, as a string. This isn't normally used 
return !DecryptedCookie.Expired; 
+0

¡Gracias @Pluto, salvaste el día! Fue su comentario "la cookie simplemente no se ha enviado al navegador todavía" que proporcionó el avance. –

Cuestiones relacionadas