asp.net - page - asp-route-id
SimpleMembership con esquema de base de datos personalizado en ASP.NET MVC 4 (7)
Quiero habilitar la API SimpleMembership de ASP.NET MVC 4 para integrarla con mi propio esquema de base de datos. Tengo una tabla sencilla en mi base de datos llamada Users
con estos campos:
- Carné de identidad
- Nombre
- Contraseña
- Esta borrado
Ya configuré la API SimpleMembership para usar mi base de datos:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true);
Y puedo insertar un usuario también:
WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
new
{
IsDeleted = false,
Email = "[email protected]"
});
Sin embargo, el campo Contraseña (o su hash) no se inserta en la tabla Usuarios (por supuesto), se inserta en otra tabla llamada webpages_Membership
que se crea con la llamada InitializeDatabaseConnection
y contiene mucha información innecesaria que no necesito.
Además, tengo otras tablas creadas automáticamente llamadas webpages_OAuthMembership, webpages_Roles y webpages_UsersInRoles que no necesito.
Ya he intentado establecer la generación de la tabla en falso:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);
Pero en este caso, la llamada CreateUserAndAccount emitirá una excepción porque no encontrará la tabla de páginas web_Membership.
Parece que estas tablas son necesarias cuando quiero usar la API SimpleMembership.
Mi pregunta es: ¿qué debo hacer en un escenario como este cuando solo quiero una simple tabla de Users
y nada más?
¿Tengo que escribir todo el manejo de la membresía y la lógica de autenticación (generación de código hash, etc.)?
1 - Debe habilitar migraciones, preferiblemente con EntityFramework 5. Use Enable-Migrations
en el administrador de paquetes NuGet.
2 - Mueva su
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true);
a su método Seed en su clase YourMvcApp / Migrations / Configuration.cs
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 se encargará de crear su tabla UserProfile, luego de hacerlo llamará a WebSecurity.InitializeDatabaseConnection para registrar SimpleMembershipProvider con la tabla UserProfile ya creada, también contando a SimpleMembershipProvider qué columna es UserId y UserName. También estoy mostrando un ejemplo de cómo puede agregar Usuarios, Roles y asociar los dos en su método Seed con propiedades / campos personalizados de UserProfile, por ejemplo, un Móvil (número) de un usuario.
3 - Ahora cuando ejecuta la base de datos de actualización desde la consola del Administrador de paquetes, EF5 aprovisionará su tabla con todas sus propiedades personalizadas
Para referencias adicionales, consulte este artículo con el código fuente: http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/
Es posible que esto no funcione para su caso de uso, pero, por supuesto, puede agregar fácilmente sus atributos de usuario a la Tabla de perfil de usuario de Simplemembership en lugar de crear otra tabla de usuario.
Recomiendo usar la tabla de membresía existente para mantener la contraseña hash, y simplemente ignorar los campos que no necesita. De esa manera mantiene la compatibilidad con SimpleMembership sin mucho alboroto.
SQLMembership es muy fácil de usar. He hecho extensas extensiones personalizadas para SQLMembership en un par de proyectos, lo cual no fue tan difícil, pero mirando hacia atrás, desearía no haberlo hecho. Es una especie de molestia de mantenimiento,
La personalización es posible.
Puede obtener el código fuente de SimpleMembershipProvider del SimpleMembershipProvider , ya que aquí es donde se produce la asignación entre el esquema de base de datos y el entorno de ejecución, puede modificar este código para modificar / reemplazar esquema, declaraciones, etc. para que coincida con sus necesidades (sin mucho dolor de cabeza, IMO.)
Le hice la misma pregunta al equipo del producto.
El objetivo de diseño de la membresía SIMPLE era trabajar de la manera más simple posible.
Entonces realmente no hay personalización posible en lo que respecta a las tablas. La solución recomendada es seguir usando la membresía ASP.NET (SqlMembershipProvider).
Puede crear su propio proveedor de membresía extendiendo MembershipProvider. Consulte Custom MembershipProvider en .NET 4.0 para obtener más detalles. Usando este enfoque, solo necesitaría implementar los métodos que necesita. Esto debería ayudar a mantener las cosas más simples y no requeriría que agregue tablas que no necesita.
Los pasos básicos (tomados de la respuesta SO vinculada) son:
- Cree un nuevo archivo de Clase (si no está utilizando un sistema de varias capas, en la carpeta Modelos de su proyecto) llamémoslo MyMembershipProvider.cs
- Heredar esa clase de System.Web.Security.MembershipProvider
- Crear automáticamente los métodos necesarios (período + espacio en la clase heredada)
Puede usar OAUth con proveedores universales ASP.NET. Los proveedores universales son la nueva versión de los proveedores de sqlmembership. estos están basados en EF CodeFirst y también generan un esquema más limpio de su base de datos. Miren mi siguiente publicación 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
Puede usar su tabla personalizada de Usuarios junto con las tablas SimpleMembership. Este método me ha funcionado muy bien en el pasado.
Por ejemplo, en su método de Registro en AccountController, registraría un nuevo usuario agregando el usuario a su propia tabla de Usuarios. A continuación, agregue este usuario a la tabla SimpleMembership UserProfile con el Id del usuario que agregó a la tabla 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);
}