¿Cómo uso mi propia base de datos con SimpleMembership y WebSecurity? ¿De qué se trata la seguridad MVC4?
He leído todo sobre este tema que pude encontrar, incluidos los artículos de MSDN y las publicaciones de SO, pero todavía estoy muy perdido y confundido.
Preguntas
Sírvase responder lo siguiente (brevemente, si es posible):
¿Qué es SimpleMembership/SimpleMembershipProvider (WebMatrix.WebData) y de qué es/son responsables?
¿Qué es WebSecurity (WebMatrix.WebData)?
¿Qué es el Membresía (Sistema.Web.Security) class?
¿Por qué MVC4 crea una tabla UserProfile y una tabla webpages_Membership? Para qué sirven y cuál es la diferencia? ¿Qué es la clase UserProfile que crea MVC4?
¿Qué es la clase UsersContext?
¿Cómo funcionan todos estos elementos en conjunto para realizar la autenticación de usuarios?
Mi situación
Estas preguntas luego conducen en el siguiente problema:
Supongamos que tengo una base de datos existente con usuarios (IDs, Nombres de usuario, contraseñas). Estoy creando una nueva aplicación MVC4 y usando la autenticación de formularios. Las contraseñas de usuario se almacenan en la base de datos de forma cifrada (no bcrypt).
¿Qué tengo que hacer para que funcione con MVC4?
¿tengo que crear un custom MembershipProvider?
Mi Conocimiento Hasta Ahora
Por lo que puedo entender, WebSecurity es una estática clase (Módulo) que interactúa con un MembershipProvider. Un MembershipProvider es una clase que explica cómo funcionan determinadas funciones, como ValidateUser, CreateUser, ChangePassword .
Para resolver mi problema asumo que necesito crear un MembershipProvider personalizado y decirle a WebSecurity que use mi nuevo MembershipProvider.
Bounty?
He puesto una recompensa en esta pregunta y la intención de premiarla a Andy Brown por un sobresaliente respuesta.
1 answers
Vea los resúmenes debajo de cada cita para una respuesta rápida, y los párrafos para detalles. Consulte también la sección de Referencias al final para ver las fuentes autorizadas.
Resúmenes
1.Qué es SimpleMembership / SimpleMembershipProvider (WebMatrix.WebData) y de qué es/son responsables?
SimpleMembership (un término que cubre tanto la SimpleMembershipProvider
y SimpleRoleProvider
) es responsable de proporcionar una forma limpia y rápida de implementación de un marco de autenticación y autorización plug and play del 80% con almacenamiento seguro de contraseñas, que cualquiera puede usar.
2.Qué es WebSecurity (WebMatrix.WebData)?
WebSecurity
es una clase auxiliar para tareas comunes de membresía que funciona junto con Membership
y OAuthWebSecurity
. Los roles se siguen accediendo por separado a través de Roles
.
3.¿Qué es la Membresía (Sistema.Web.Seguridad) la clase?
Membership
es una clase estática del original ASP.NET implementación de membresía que administra la configuración y las operaciones del usuario. Muchas operaciones de usuario todavía se realizan aquí en lugar de repetirlas en WebSecurity
. Ambos utilizan el mismo proveedor de su elección.
4.¿Por qué MVC4 crea una tabla UserProfile y una tabla webpages_Membership? Para qué sirven y cuál es la diferencia? Cuál es la clase UserProfile que MVC4 crea?
Las dos tablas realizan funciones diferentes. El esquema webpages_Membership
es controlado por el framework y usado para credenciales, el esquema UserProfile
es controlado por nosotros y usado para cualquier propiedad que queramos almacenar contra un usuario.
5.¿Qué es la clase UsersContext?
Es un DbContext
(parte de la API DbContext ) proporcionada como inicio por la plantilla de aplicación de Internet MVC. Su único trabajo es contener la clase UserProfile
así que podemos trabajar con él (por ejemplo, a través de InitializeSimpleMembershipAttribute
).
6.¿Cómo funcionan todos estos elementos en conjunto para realizar la autenticación de usuarios?
This should now be evident from the summaries above and the detail below. Use: WebSecurity
para tareas comunes; UserProfile
para propiedades personalizadas que se almacenarán contra un usuario, al que se accede a través de UsersContext
(en la plantilla "MVC Internet Application" de Visual Studio); Membership
cuando WebSecurity
o OAuthWebSecurity
no tenga el método; y Roles
para roles. Usar la plantilla VS controlador para ver ejemplos de uso.
Edit . En caso de que alguien haya llegado hasta aquí
Supongamos que tengo una base de datos existente ...
Si tiene una base de datos existente, y su única razón para escribir un proveedor de membresía personalizado es tratar con su método de almacenamiento de contraseñas heredado, entonces podría usar una solución alternativa. Esto solo funcionará si puede alejarse de su antiguo almacenamiento de contraseñas al algoritmo SimpleMembership (que utiliza el Rfc2898DeriveBytes
class). Vea la nota al pie para más detalles.
Si no puede alejarse, entonces sí tendrá que crear su propio proveedor para usar su algoritmo de contraseña específico, lo que puede hacer derivando de SimpleMembershipProvider
.
NOTA: SimpleMembershipProvider
HASH sus contraseñas no CIFRAR. Si no conoce la diferencia y por qué eso es importante, piénselo dos veces antes de hacer su propio proveedor con custom seguridad
Detalle
1.Qué es SimpleMembership / SimpleMembershipProvider
Entender cómo todo encaja ayuda a entender la historia.
- ASP.NET in 2005 introduced the ASP.NET Sistema de membresía
- Este sistema utilizó proveedores para abstraer detalles de implementación de interfaces comunes utilizadas para administrar cuentas y roles, etc.
- También nos dio un "perfil de usuario básico" capacidad (almacenada en un campo xml de una sola columna que, por lo tanto, las personas tienden a evitar)
- SimpleMembership fue lanzado al mundo en 2010 ish como un proveedor que se conecta a la ASP.NET sistema de membresía, pero también permite la autenticación OAuth y el almacenamiento de perfiles de usuario de propiedad por columna (en lugar del almacenamiento de una sola columna utilizado en la implementación original).
-
SimpleMembershipProvider
implementaExtendedMembershipProvider
para extender el proveedor original aplicación
Es de código Abierto en codeplex (reflejado en github). Por lo tanto, en lo que respecta a la seguridad, puede evaluar el código usted mismo, clonarlo, cambiarlo, etc. Usted debe tomar su propio punto de vista sobre el beneficios e inconvenientes de seguridad de código abierto, y cocinar que hasta con una pizca de NIH. (Vista personal: Lo uso a veces, no lo uso otras veces )
ExtendedMembershipProvider
en sí mismo añade comandos como GeneratePasswordResetToken
a las antiguas api de proveedores de membresía.
2.Qué es WebSecurity (WebMatrix.WebData)?
WebSecurity
es simplemente una fachada, o clase auxiliar, para proporcionar un acceso simple a SimpleMembershipProvider
y hacer que las tareas comunes sean fáciles y accesibles en un solo lugar. Está ahí tanto para ayudar como porque la extensión del framework original a través de ExtendedMembershipProvider
significa que algunas de las clases originales como Membership
no son suficientes ahora. Ejemplos:
-
WebSecurity.CurrentUserName
- obtiene el nombre del usuario actualmente conectado -
WebSecurity.CreateUserAndAccount
. Crear simultáneamente un usuario y establecer propiedades de perfil de usuario (por ejemplo,WebSecurity.CreateUserAndAccount(userName, pw, new { Email = model.Email });
-
WebSecurity.InitializeDatabaseConnection
- Configure rápidamente una base de datos nueva/existente para usarla con la membresía, elija su columna de id de usuario e identificador de clave natural de usuario, etc. -
ResetPassword
para restablecer una contraseña de usuario,GeneratePasswordResetToken
y muchos más
Estos métodos generalmente remiten al proveedor que está utilizando, no solo dependen de SimpleMembership, y unen objetos como su proveedor y Membership
para proporcionar un punto común para realizar funciones de membresía.
Nota también hay OAuthWebSecurity
que es el equivalente de WebSecurity
para la autenticación OAuth.
3.¿Qué es la Membresía (Sistema.Web.Seguridad) clase?
Membership
es de la implementación original; administra la configuración del usuario y realiza operaciones relacionadas con el usuario utilizando la implementación básica MembershipProvider
que ExtendedMembershipProvider
ahora se extiende. Es un clase estática, por lo que está disponible en cualquier lugar que declare el espacio de nombres, y por lo tanto es una manera fácil de, por ejemplo, recuperar el usuario actual: Membership.GetUser
Hay confusión causada por el hecho de que WebSecurity
hace algunas cosas y no otras, y Membership
hace algunas cosas y no otras. Si ves WebSecurity
como un kit de herramientas para operaciones de nivel superior, y Membership
como un kit de herramientas para hacer cosas a un usuario, estarás bien; trabajan juntos en tu proveedor.
4.Por qué MVC4 crea una tabla de UserProfile ¿y una tabla de webpages_Membership? Para qué sirven y cuál es la diferencia? ¿Qué es la clase UserProfile que crea MVC4?
-
webpages_Membership
es una tabla con un esquema fijo que dejamos solo, y permite al proveedor realizar las operaciones básicas de la cuenta, principalmente almacenar credenciales. -
UserProfile
es una tabla que personalizamos para almacenar información en una cuenta de usuario, y la ponemos a disposición en un formato fuertemente escrito a través de la claseUserProfile
. - Hay una tabla extra llamada
webpages_OAuthMembership
que hace el mismo trabajo quewebpages_Membership
, pero para los proveedores de inicio de sesión de OAuth con los que desea integrarse.
La magia de esta configuración es que un solo usuario puede tener un inicio de sesión de membresía en su propio sitio, y cualquier número de inicios de sesión de OAuth con diferentes proveedores como Google, facebook, y todos ellos comparten un perfil común almacenado en UserProfile
Generalmente si una tabla comienza con webpages_
, significa que hay una API para acceder a ella. La tabla UserProfile
está representada por la clase UserProfile
en su UsersContext
(si usa la plantilla predeterminada de aplicación de Internet MVC). Por lo tanto, accedemos a esto a través de los métodos habituales que usaríamos con cualquier clase contenida en a DbContext
.
UserProfile
es muy amigable con el código: puede agregar columnas (como la dirección Email
del usuario) y luego configurar una migración para incluir esa columna en su base de datos en su próxima versión (si le gusta usar migraciones). De hecho, la tabla UserProfile
no tiene que llamarse así-puede cambiar eso usando la llamada WebSecurity.InitializeDatabaseConnection
, [Table("UserProfile")] public class UserProfile
, y sus propias migraciones.
5.¿Qué es la clase UsersContext?
Esto es de la plantilla de aplicación de Internet MVC proporcionada en Visual Studio Nuevo Proyecto. Lo primero que hago es asegurarme de que comparte una cadena de conexión común con mi propio contexto de base de datos (suponiendo que las tablas de membresía estén en la misma base de datos). Puede cambiar esto y desacoplarlos más tarde si lo desea.
No necesitas tenerlo separado de tu propio contexto - eso solo es necesario si desea almacenar información de membresía en una base de datos diferente ahora o en el futuro Si se deshace de ella, puede cambiar las referencias a UsersContext
a su propio contexto, ajustando Database.SetInitializer
.
Referencias:
Usando SimpleMembership Con ASP.NET Página web-Matthew Osborn - Esta es la referencia original sobre SimpleMembership y lo que es, por qué es, y lo que hace:
MSDN-Introducción a Composición - La membresía sigue siendo el núcleo de SimpleMembership, por lo que ayuda a entender un poco al respecto.
- codeplex source (mirrored on github).
WebSecurity
OAuthWebSecurity
SimpleMembershipProvider
ExtendedMembershipProvider
SimpleRoleProvider
Membership
Roles
-
DbContext
y el DbContext API
EDITAR Nota al pie: el detalle para hacer una actualización de contraseña continua
- Agregue una propiedad a
UserProfile
que almacena en qué versión de contraseña se encuentra la cuenta (por ejemplo, 1 para legacy, 2 para SimpleMembership) - En la acción" Login", escriba el código para que:
- Si están en su versión de contraseña de SimpleMembership, realiza un inicio de sesión normal
- Si están en la versión de contraseña heredada,:
- comprobarlo usando su antiguo método
- si es correcto restablecerlo usando
ResetPassword
entoncesChangePassword
para usar la versión SimpleMembership, esto actualizará el campo a la nueva versión de contraseña - y finalmente actualizar la versión de contraseña en el
UserProfile
- Actualice cualquier otro método AccountsController que use la contraseña de una manera similar.
- Vive con la solución de hacky y el acoplamiento a la tabla
webpages_Membership
no estamos destinados a tocar como no lo hiciste para escribir un nuevo proveedor personalizado.
Es posible hacer todo esto transaccional con TransactionScope
. Lo único desagradable que está pasando es el código extra en el controlador, y el acoplamiento a webpages_Membership
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:17