También puedes hacer lo siguiente. En el formulario en el que el usuario introduce sus datos y los validas creas un ticket de autenticación. Este ticket lo enviarás en forma de cookie al cliente.
Código:
....
FormsAuthentication.Initialize()
' Se crea el ticket con el rol que le corresponda
Dim ticket As New FormsAuthenticationTicket(1, _
nombreUsuario, DateTime.Now, _
DateTime.Now.AddMinutes(20), _
True, roles, _
FormsAuthentication.FormsCookiePath)
' Se encripta el ticket
Dim encTicket As String = FormsAuthentication.Encrypt(ticket)
' Se crea la cookie con el ticket encriptado
Dim cookie As New HttpCookie(FormsAuthentication.FormsCookieName, encTicket)
' Caducidad de la cookie igual que el ticket
'cookie.Expires = ticket.Expiration
' Se envía la cookie
Response.Cookies.Add(cookie)
' Se redirige al usuario
Response.Redirect(Request.QueryString("ReturnUrl"))
...
Luego, desde cualquier parte del sitio y siempre que no haya caducado el ticket puedes acceder al nombre de usuario de esta manera:
Código:
Dim nombreUsuario As String = Context.User.Identity.Name
No olvides poner esto en el archivo global.asax:
Código:
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
' Se desencadena al intentar autenticar el uso
If Not (HttpContext.Current.User Is Nothing) Then
If HttpContext.Current.User.Identity.IsAuthenticated Then
If TypeOf HttpContext.Current.User.Identity Is FormsIdentity Then
Dim id As FormsIdentity = CType(HttpContext.Current.User.Identity, FormsIdentity)
Dim ticket As FormsAuthenticationTicket = id.Ticket
Dim userData As String = ticket.UserData
Dim roles() As String = userData.Split(",")
HttpContext.Current.User = New GenericPrincipal(id, roles)
End If
End If
End If
End Sub
Es un poco más largo pero luego el acceso es más rápido y sin recurrir a variables de sesión.
Un saludo.
PD: A ver si le podéis echar un vistacillo a mi problemilla.