2009-08-31 18 views
5

En una aplicación ASP.net estoy usando un control de inicio de sesión con un proveedor de membresía personalizado que escribí. Lo que quiero hacer es establecer Thread.CurrentPrincipal en mi objeto Principal personalizado, justo después de que el usuario sea autenticado.Cómo configurar Thread.CurrentPrincipal para usar en toda la aplicación?

Estoy usando el setter: Thread.CurrentPrincipal y establece el objeto principal para mí pero, en todos los hilos consecuentes, este CurrentPrincipal se reemplaza por el predeterminado.

Aquí está mi código para el evento Autenticación del control de ingreso:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
    { 
     string username = Login1.UserName; 
     string password = Login1.Password; 

     if (Membership.ValidateUser(username, password)) 
     { 
      var login = sender as Login; 
      var phoenixIdentity = new PhoenixIdentity("B", "Forms" , true); 
      var principal = new PhoenixPrincipal(phoenixIdentity); 

      Thread.CurrentPrincipal = principal; 
      AppDomain.CurrentDomain.SetThreadPrincipal(principal); 

      HttpContext.Current.User = principal; 

      e.Authenticated = true; 
     } 
    } 

Por ejemplo, imagine que me conecto con el nombre de usuario A, todo va bien ... Validación pasa, pero codificar el usuario con el nombre de usuario B en el objeto Identity que está establecido en el objeto Principal que configuré como el objeto CurrentPrincipal.

Cuando compruebo qué usuario está configurado con la identidad CurrentPrincipal al final de este método, dice que es el usuario B. Pero cuando cargo otra página y luego verifico cuál es la identidad del CurrentPrincipal, dice que es el usuario A.

Entonces, ¿cómo puedo hacer que mi objeto CurrentPrincipal sea persistente en todos los otros hilos, y dónde/cuándo este control de inicio de sesión establece el objeto CurrentPrincipal del Subproceso?

+0

¿Qué estás haciendo? ¿Desea que todos sean identificados como el primer usuario conectado? Debe comprender los mecanismos de autenticación y autorización de aplicaciones web, el uso de cookies, etc. No puede establecer un principal para todos los subprocesos de aplicaciones multiusuario. –

+0

Por supuesto que no. Tal vez no me expresé con la suficiente claridad. – Goran

Respuesta

1

Puede manejar FormsAuthentication_OnAuthenticate (remitente del objeto, FormsAuthenticationEventArgs e) (en Global.asax) y establecer CurrentPrincipal aquí.


void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e) 
{ 
var phoenixIdentity = new PhoenixIdentity("B", "Forms" , true); 
var principal = new PhoenixPrincipal(phoenixIdentity); 
e.User = principal; 
} 
+0

Permítanme aclarar esto más ... ESTOY utilizando la autenticación de Formularios, si no lo han notado ... Es solo que quiero mantener la Id. De usuario (junto con otra información de usuario) en el objeto de Identidad del Subproceso .CurrentPrincipal, así que implementé mis propios objetos Principal e Identity y anulé el método de Autenticación del control de inicio de sesión de la autenticación de Forms. – Goran

+0

Probaré esto ahora mismo ... – Goran

2

Tadas no es incorrecto, FormsAuthentication correctamente implementado no causará este problema. Su página es accesible incluso sin inicio de sesión, solo en la página de inicio de sesión, el principio de su hilo se establece manualmente, pero cuando toca la otra URL, no llama a su página de inicio de sesión y recuerda que cada página funciona por sí misma hilo diferente. Si solicita la primera página y establece el principio del hilo y solicita una segunda página en la misma instancia del navegador, puede ser o no el mismo hilo.

Así es como funciona FormsAuthentication,

  1. Comprueba si autenticación cookie se establece o no, se dirige entonces a la página de acceso de usuario
  2. página de inicio de sesión debe validar y establecer cookie de autenticación, como FormsAuthentication.SetAuthCookie
  3. Antes de cada acceso a la página, se ejecuta el Paso 1.
  4. Después de la validación exitosa de Auth Cookie, ASP.NET establece internamente el usuario actual y todos los parámetros de differnet según su componente de membresía.
  5. ASP.NET El archivo Global.asax puede proporcionarle algunos eventos donde puede agregar el código para verificar justo después de que la autenticación sea exitosa puede cambiar su usuario actual, recuerde establecer su principio actual en la página de inicio de sesión no ayudará

Tuvimos un problema similar cuando estábamos usando la sesión para almacenar cierta información importante, después de que las sesiones de autenticación no se reconstruyeron, entonces escribimos un Módulo HTTP y en su método init adjuntamos el evento AfterRequestAcquired y en este evento puede escribir su código para crear una instancia de todas sus variables importantes relacionadas con el usuario.

1

Esto es lo que hice en el método FormsAuthentication_OnAuthenticate:

if (FormsAuthentication.CookiesSupported) 
     { 
      if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) 
      { 
       try 
       { 
        FormsAuthenticationTicket ticket = 
         FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value); 

        var myIdentity = new GenericIdentity("B"); 
        var principal = new GenericPrincipal(myIdentity, new string[]{"rola1"}); 
        e.User = principal; 
       } 
       catch (Exception ex) 
       { 
        // Decrypt method failed. 
       } 
      } 
     } 
     else 
     { 
      throw new HttpException("Cookieless Forms Authentication is not " + 
            "supported for this application."); 
     } 

parece que está funcionando lo que debería hacer ... Es que si pongo mi costumbre par director/identidad como e.User, a continuación, Tengo un problema de serialización que necesito solucionar a continuación ... Gracias chicos ...

+0

El problema de serialización simplemente desapareció cuando cambié a IIS en lugar de usar el servidor de desarrollo de Visual Studio. – Goran

Cuestiones relacionadas