2011-04-10 9 views
14

Necesito alguna funcionalidad en una aplicación ASP.NET MVC y después de investigar un poco, siento que tengo que implementar UserhipUser, MembershipProvider, Identity y Principal personalizados. Mi problema es: no entiendo la relación, si existe, entre MembershipUser e Identity y dónde exactamente MembershipProvider y Principal entran en escena. Podría alguien por favor arrojar algo de luz. Tengo varios artículos y tutoriales en la web sobre los cuatro jugadores, pero ninguno aborda la relación entre ellos por completo.ASP.NET MVC: Relación entre MembershipUser, Identity, MembershipProvider y Principal

Además, ¿hay una forma elegante de asignar el principal personalizado al Context.User distinto de AuthenticateRequest en Global.asax? He visto muchos ejemplos sobre cómo hacer esto en las aplicaciones ASP.NET WebForms y me preguntaba si ASP.NET MVC tiene una mejor manera.

Respuesta

27

IPrincipal es el contexto de seguridad que se crea para cada solicitud web y contiene información relacionada con la identidad del usuario y los roles que tienen.

un IPrincipal contiene un IIdentity que tiene un Name, un IsAuthenticated y AuthenticationType propiedades.

es una clase que se deriva de la clase abstracta MembershipProvider para proporcionar datos personalizados sobre los usuarios que usan su aplicación. El proveedor operará en los tipos MembershipUser y se puede utilizar para obtener datos para un usuario o usuarios en particular, crear nuevos usuarios, etc. Puede heredar de MembershipUser para crear su propio tipo de usuario y, por lo general, puede querer hacer esto cuando también usa su propio proveedor.

Al acceder a una aplicación, un IPrincipal y IIdentity se crean y asignan a HttpContext.Current.User y Thread.CurrentPrincipal para proporcionar información de seguridad para cualquier acción que pueda ser tomada durante el tiempo de vida de la solicitud.

Si está utilizando un RoleProvider, se crea una instancia de tipo RolePrincipal que se engancha en el RoleProvider configurado para obtener roles para el usuario; si no está utilizando un RoleProvider, se creará una instancia de tipo GenericPrincipal.

Si está utilizando la autenticación de formularios y un usuario ha iniciado sesión, se creará una instancia de tipo FormsIdentity; si un usuario no está autenticado, se crea una instancia de tipo GenericIdentity. El IIdentity que se crea es lo que finalmente se serializará en la cookie de autenticación que se devuelve al navegador y lo que se usará para construir el FormsAuthenticationTicket y el IIdentity en la próxima solicitud.

El MembershipProvider se adapta a esto proporcionando más información sobre el usuario. el método Membership estático de la clase GetUser() utilizará el IIdentity.Name actual y el MembershipProvider configurado para devolver una instancia de MembershipUser (o clase derivada si ha definido uno) que contiene los datos sobre el usuario.

Dado que ASP.NET MVC está construido sobre la tubería de procesamiento de ASP.NET, el lugar donde desea establecer su propio IIdentity y IPrincipal es el mismo. Hasta donde yo sé, no hay mejor lugar en la arquitectura MVC para configurarlos.

Nota: esto es todo de la memoria.Si tengo algo mal, por favor avíseme y lo actualizaré.

+0

Esto es exactamente lo que necesitaba. ¡Gracias! – Joe

+0

Tenga en cuenta que en MVC 5, Microsoft se alejó de MembershipProvider a favor de ASP.net Identity. – Brian

Cuestiones relacionadas