Quiero habilitar el ASP.NET MVC 4 SimpleMembership API para integrar con mi propio esquema de base de datos. Tengo una simple y sencilla tabla en mi base de datos llamada Users con estos campos:

  • Id
  • Nombre
  • Contraseña
  • Correo electrónico
  • IsDeleted

Ya he configurado el SimpleMembership API para usar mi base de datos:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true);

Y puedo insertar un usuario demasiado:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
                                 new 
                                 { 
                                        IsDeleted = false, 
                                        Email = "[email protected]"                
                                 });

Sin embargo, el campo de Contraseña (o hash) no se inserta en la tabla de Usuarios (por supuesto), se inserta en otra tabla llamada webpages_Membership que se crea con la InitializeDatabaseConnection llamada y contiene una gran cantidad de información innecesaria que no necesito.

También, he creado automáticamente tablas denominadas webpages_OAuthMembership, webpages_Roles y webpages_UsersInRoles que no necesito.

Ya he probado a poner la mesa a la generación de falsas:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);

Pero en este caso la CreateUserAndAccount llamada lanzará una excepción, porque no van a encontrar la webpages_Membership tabla.

Parece que estas tablas necesarias cuando quiero usar el SimpleMembership de la API.

Mi pregunta es: ¿qué debo hacer en una situación como esta cuando quiero sólo un simple Users mesa y nada más?

¿Tengo que escribir la totalidad de miembros de la manipulación y la lógica de autenticación (hash generación de código, etc.) yo mismo?

InformationsquelleAutor Zsolt | 2012-09-10

7 Comentarios

  1. 11

    Me hizo la misma pregunta para el equipo de producto.

    El objetivo del diseño de la SIMPLE pertenencia fue a trabajar fuera de la caja tan simple como sea posible.

    Así que no hay personalización de la posible medida de que las tablas son de que se trate.
    La solución recomendada es, para el uso ASP.NET la Membresía (SqlMembershipProvider).

    • Ok, gracias! Tal vez voy a escribir mi costumbre lógica de autenticación.
    • NO! Por favor, no lo hagas! 🙂
    • El uso de SqlMembership es muuuy fácil! Sólo la búsqueda de un tutorial en ASP.NET la Membresía. Es muy flexible!
    • Hmm…he buscado por «OAuth» y me gusta este tipo de inicio de sesión de concepto. Puedo utilizar la nueva compatibilidad con OAuth con SqlMembershipProvider?
    • Te refieres a OAuth en ASP.NET MVC 4? Que yo sepa.. NO! Así que.. mejor seguir con las tablas de la simple Pertenencia 🙂 eso es lo Que me he decidido!
    • Muy bien, gracias! A veces la vida no es tan flexible :)…
    • No hay nada que impide el uso de EF para obtener los datos del usuario. weblogs.asp.net/jgalloway/archive/2012/08/29/…
    • Yo he venido aquí para publicar el mismo enlace como James hizo, que más o menos contradice la idea de que la intención de la Simple Pertenencia fue la simplicidad de la caja – el original del proveedor de pertenencia hizo un buen trabajo de eso. El nuevo proveedor está diseñado, al menos supuestamente, para ser más simple de extender.
    • Esta respuesta es engañosa. Es posible abrazar y ampliar el sistema existente. Si la experiencia no es ofrecer un esquema de estar de acuerdo con usted fácilmente puede implementar su propia SimpleMembershipProvider para crear y utilizar un esquema de su propio diseño.

  2. 3

    1 – necesita habilitar las migraciones, prefereably con EntityFramework 5. Uso Enable-Migrations en el NuGet package manager.

    2 – Mover el

    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 

    a tu Simiente método en su YourMvcApp/Migraciones/Configuración.cs de la clase

        protected override void Seed(UsersContext context)
        {
            WebSecurity.InitializeDatabaseConnection(
                "DefaultConnection",
                "UserProfile",
                "UserId",
                "UserName", autoCreateTables: true);
    
            if (!Roles.RoleExists("Administrator"))
                Roles.CreateRole("Administrator");
    
            if (!WebSecurity.UserExists("lelong37"))
                WebSecurity.CreateUserAndAccount(
                    "lelong37",
                    "password",
                    new {Mobile = "+19725000000", IsSmsVerified = false});
    
            if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
                Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
        }

    Ahora EF5, será el encargado de crear su perfil de usuario de la tabla, después de hacerlo, se llame a la WebSecurity.InitializeDatabaseConnection para registrar el SimpleMembershipProvider con el ya creado UserProfile tabla, también tellling SimpleMembershipProvider que la columna es el nombre de usuario y nombre de Usuario. También estoy mostrando un ejemplo de cómo usted puede agregar Usuarios, Roles y asociando los dos en su Semilla método con la costumbre de UserProfile propiedades o campos por ejemplo, un Móvil del usuario (número).

    3 – Ahora, cuando ejecute la actualización de la base de datos de la Consola del Administrador de Paquetes, EF5 va a proporcionar a su mesa, con todas sus propiedades personalizadas

    Para referencias adicionales, por favor consulte este artículo con código fuente:
    http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

    • Creo que esta publicación de blog es acerca de otro tema: la siembra de datos con EF Código de Migraciones. Sé que puedo agregar ninguna propiedad a mi tabla de Usuario (por ejemplo, un Móvil de la cadena), mi pregunta no era sobre eso, sino sobre la reescritura/personalización de todo el esquema de la genera automáticamente SimpleMembership tablas.
  3. 2

    Puede utilizar OAUth con ASP.NET Universal de los Proveedores. universal de los proveedores son de la nueva versión de sqlmembership proveedores. estos se basan en EF CodeFirst, y también generar un mayor limpiador esquema de la base de datos
    mira mi siguiente post para más detalles
    http://blogs.msdn.com/b/pranav_rastogi/archive/2012/09/12/integrate-openauth-openid-with-your-existing-asp-net-application-using-universal-providers.aspx

    • Proveedores universales no son compatibles con SimpleMembership, y esto no abordar el OP pregunta.
  4. 2

    Esto puede no funcionar para su uso-caso pero, por supuesto, usted puede agregar fácilmente sus atributos de usuario para el Simplemembership UserProfile Tabla en lugar de crear otro Usuario Tabla

    Recomendaría el uso de los miembros existentes de la tabla para mantener el hash de la contraseña, y simplemente ignorar los campos que usted no necesita. De esa manera mantiene la compatibilidad con SimpleMembership sin mucho alboroto.

    SQLMembership es muy fácil de sacar de la caja. He realizado multitud de extensiones personalizadas para SQLMembership en un par de proyectos, que no era tan difícil – pero mirando hacia atrás, me gustaría no había. Es un tipo de mantenimiento molestia,

  5. 2

    Usted puede crear su propio proveedor de pertenencia mediante la ampliación de la MembershipProvider. Ver Personalizado MembershipProvider en .NET 4.0 para obtener más detalles. Con este enfoque, sólo se necesita para implementar los métodos que usted necesita. Esto debería ayudar a mantener las cosas más simples y no requieren agregar las tablas que usted no necesita.

    Los pasos básicos (tomado de el LO vinculado a la respuesta) son:

    1. Crear un nuevo archivo de Clase (si no estás usando un multi-sistema de capas, en el proyecto de la carpeta Modelos) vamos a llamar MyMembershipProvider.cs
    2. Que heredan de la clase de Sistema.Web.De seguridad.MembershipProvider
    3. Automágicamente crear la necesaria métodos (período + espacio en el heredan de la clase)
  6. 0

    Usted podría utilizar su personalizados a los Usuarios de la tabla junto con el SimpleMembership tablas. Este método ha funcionado muy bien para mí en el pasado.

    Por ejemplo, en el método de Registro en el AccountController, usted podría registrar un nuevo usuario, agregue el usuario a su propia tabla de Usuarios. Luego agregar este usuario a la SimpleMembership UserProfile tabla con el Id del usuario que se agregó a la tabla de Usuarios.

    using (var context = new MyDatabaseEntities())
    {
        User newUser = new User(){
          Name = model.Name,
          Email = model.Email,
          IsDeleted = false
        }
    
        //Add the user to your custom Users table
        context.Users.Add(newUser);
        context.SaveChanges();
    
        //Add this user to the SimpleMembership table using the same Id as the custom Users table
        WebSecurity.CreateUserAndAccount(newUser.Id.ToString(), model.Password);
    
        //Log the user in
        WebSecurity.Login(newUser.Id.ToString(), model.Password);
    }

Dejar respuesta

Please enter your comment!
Please enter your name here