¿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):

  1. ¿Qué es SimpleMembership/SimpleMembershipProvider (WebMatrix.WebData) y de qué es/son responsables?

  2. ¿Qué es WebSecurity (WebMatrix.WebData)?

  3. ¿Qué es el Membresía (Sistema.Web.Security) class?

  4. ¿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?

  5. ¿Qué es la clase UsersContext?

  6. ¿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.

Author: Rowan Freeman, 2013-05-23

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 implementa ExtendedMembershipProvider 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 clase UserProfile.
  • Hay una tabla extra llamada webpages_OAuthMembership que hace el mismo trabajo que webpages_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.


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 entonces ChangePassword 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.

 182
Author: Andy Brown,
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