2009-12-01 18 views
5

Deseo utilizar AuthorizeAttribute para controlar a qué usuarios se les permite el acceso a mis acciones. Solo quiero aclarar que mi lógica está en orden.Membresías de ASP.Net MVC

  1. Creo mi propia implementación de IPrincipal
  2. puedo enviar las credenciales de un usuario a una acción de acceso de un controlador de seguridad.
  3. puedo validar las credenciales con una clase UserService y asignar el IPrincipal regresó de mi clase UserService a HttpContext.User
  4. Mi WebAuthorizeAttribute, que hereda AuthorizeAttribute, comprueba la corriente HttpContext.User.Identity.IsAuthenticated y HttpContext.User.IsInRole para determinar si el usuario tiene acceso a la acción.

¿Es el flujo normal de las cosas? Sé que podría heredar MembershipProvider, pero no necesito toda la funcionalidad, solo la capacidad de iniciar sesión con dos roles diferentes.

Respuesta

4

Tendrá que almacenar IPrincipal en algún lugar y restaurarlo con cada solicitud. Si va a utilizar FormsAuthentication, esta es una buena solución:

ASP.NET 2.0 Forms authentication - Keeping it customized yet simple

se pueden encontrar otras soluciones aquí:

Where to store logged user information on ASP.NET MVC using Forms Authentication?

y además probablemente en muchas otras preguntas StackOverflow :)

EDITAR

Acerca de MyBusinessLayerSecurityClass.CreatePrincipal (id, id.Name):

Debe leer esta página:

http://msdn.microsoft.com/en-us/library/aa480476.aspx

Especialmente esto:

El FormsAuthenticationModule clase construye un GenericPrincipal objeto y st lo encuentra en el contexto HTTP . El GenericPrincipal objeto contiene una referencia a una instancia de FormsIdentity que representa el usuario actualmente autenticado. Debe permitir la autenticación de formularios para administrar estas tareas . Si sus aplicaciones tienen requerimientos específicos, tales como el establecimiento de la usuario propiedad a una clase personalizada que implementa el interfaz IPrincipal, su aplicación debe manejar la PostAuthenticate caso .El evento PostAuthenticate se produce después de que el FormsAuthenticationModule ha verificado la autenticación de formularios galletas y creó el GenericPrincipal y FormsIdentity objetos. Dentro de este código, puede construir una costumbre IPrincipal objeto que envuelve el FormsIdentity objeto, y luego almacenarla en el HttpContext. Usuario propiedad.

FormsIdentity se gestiona automáticamente después de establecer la cookie de autenticación. Todo lo que tiene que hacer es resumirlo en su IPrincipal. Todo esto sucede cuando HttpContext.Current.User propiedad no es nulo (es GenericPrincipal, que reemplaza poco después). Cuando HttpContext.Current.User es nulo, no se creó una cookie de autenticación antes y el usuario no está autenticado.

+0

He leído un montón de las preguntas y blogs externos, pero ninguno parece realmente a poner toda esta parte en su contexto. – scottm

+0

podría explicar la MyBusinessLayerSecurityClass.CreatePrincipal (id, id.Name) de la porción. No entiendo cómo se obtiene un FormsIdentity si la propiedad HttpContext.Current.User es nula. – scottm

2

Creo que el siguiente es más típica:

  1. Creo mi propia implementación de IPrincipal
  2. puedo enviar las credenciales de un usuario a una acción de acceso de un controlador de seguridad.
  3. puedo validar las credenciales con una clase UserService y construir una galleta que tiene cierta información de identificación para este usuario. Normalmente se utilizan FormsAuthentication.SetAuthCookie o alguna combinación de los métodos de utilidad de esa clase.
  4. En el caso de aplicaciones AuthenticateRequest, inspeccione la cookie y asignar Context.User. Nota: Este valor se asigna automáticamente a Thread.CurrentPrincipal después del evento AuthenticateRequest. Esta es una asignación de una sola vez y estos valores no se sincronizan automáticamente a partir de entonces.
  5. Mi WebAuthorizeAttribute, que hereda AuthorizeAttribute, comprueba el HttpContext.User.Identity.IsAuthenticated actual y HttpContext.User.IsInRole para determinar si el usuario tiene acceso a la acción.
+1

+1: Eso es lo que hago también. Mi publicación explica cómo inspeccionar la cookie. – LukLed

+0

excelente, gracias por la entrada – scottm