c# - que - seguridad asp net mvc 5
¿Cómo puedo cambiar los nombres de las tablas cuando uso Visual Studio 2013 ASP.NET Identity? (5)
Estoy utilizando la versión de lanzamiento (RTM, no RC) de Visual Studio 2013 (descargado de MSDN 2013-10-18) y, por lo tanto, la última versión (RTM) de AspNet.Identity. Cuando creo un nuevo proyecto web, selecciono "Cuentas de usuario individuales" para la autenticación. Esto crea las siguientes tablas:
- AspNetRoles
- AspNetUserClaims
- AspNetUserLogins
- AspNetUserRoles
- AspNetUsers
Cuando registro un nuevo usuario (usando la plantilla predeterminada), se crean estas tablas (enumeradas arriba) y la tabla AspNetUsers tiene un registro insertado que contiene:
- Carné de identidad
- Nombre de usuario
- PasswordHash
- SecurityStamp
- Discriminado
Además, agregando propiedades públicas a la clase "ApplicationUser" he agregado campos adicionales a la tabla AspNetUsers, como "FirstName", "LastName", "PhoneNumber", etc.
Aquí está mi pregunta ¿Hay alguna manera de cambiar los nombres de las tablas anteriores (cuando se crearon por primera vez) o siempre se nombrarán con el prefijo AspNet
como he enumerado anteriormente? Si los nombres de la tabla se pueden nombrar de manera diferente, explique cómo.
- ACTUALIZACIÓN -
Implementé la solución de @Hao Kung. Crea una nueva tabla (por ejemplo, la llamé MyUsers), pero también crea la tabla AspNetUsers. El objetivo es reemplazar la tabla "AspNetUsers" con la tabla "Mis usuarios". Vea el código a continuación y la imagen de la base de datos de tablas creadas.
En realidad, me gustaría reemplazar cada tabla AspNet
con mi propio nombre ... Por ejemplo, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles y MyUsers.
¿Cómo puedo lograr esto y terminar con solo un conjunto de tablas?
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string PostalCode { get; set; }
public string PhonePrimary { get; set; }
public string PhoneSecondary { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(): base("DefaultConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>().ToTable("MyUsers");
}
}
- ACTUALIZAR RESPUESTA -
Gracias a Hao Kung y Peter Stulinski. Esto resolvió mi problema ...
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles");
modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins");
modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims");
modelBuilder.Entity<IdentityRole>().ToTable("MyRoles");
}
A continuación está mi solución de trabajo:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder); // This needs to go before the other rules!
modelBuilder.Entity<ApplicationUser>().ToTable("User");
modelBuilder.Entity<IdentityRole>().ToTable("Role");
modelBuilder.Entity<IdentityUserRole>().ToTable("UserRole");
modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim");
modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
Vea this para más detalles
Podemos cambiar los nombres de tabla predeterminados de identidad de asp.net de esta manera:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(): base("DefaultConnection")
{
}
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>().ToTable("user");
modelBuilder.Entity<ApplicationUser>().ToTable("user");
modelBuilder.Entity<IdentityRole>().ToTable("role");
modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
modelBuilder.Entity<IdentityUserLogin>().ToTable("userlogin");
}
}
Además, podemos extender cada clase y agregar cualquier propiedad a clases como ''IdentityUser'', ''IdentityRole'', ...
public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
public ApplicationRole()
{
this.Id = Guid.NewGuid().ToString();
}
public ApplicationRole(string name)
: this()
{
this.Name = name;
}
// Add any custom Role properties/code here
}
// Must be expressed in terms of our custom types:
public class ApplicationDbContext
: IdentityDbContext<ApplicationUser, ApplicationRole,
string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
static ApplicationDbContext()
{
Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
// Add additional items here as needed
}
Para ahorrar tiempo, podemos utilizar la plantilla de proyecto extensible AspNet Identity 2.0 para extender todas las clases.
Puede hacerlo fácilmente modificando IdentityModel.cs como se muestra a continuación:
Anule OnModelCreating en su DbContext luego agregue lo siguiente, esto cambiará la tabla AspNetUser a "Usuarios", también puede cambiar los nombres de los campos; la columna Id predeterminada se convertirá en User_Id.
modelBuilder.Entity<IdentityUser>()
.ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
o simplemente la siguiente si desea mantener todos los nombres de columna estándar:
modelBuilder.Entity<IdentityUser>()
.ToTable("Users", "dbo")
Ejemplo completo a continuación (esto debería estar en su archivo IdentityModel.cs) Cambié mi clase ApplicationUser para llamarme User.
public class User : IdentityUser
{
public string PasswordOld { get; set; }
public DateTime DateCreated { get; set; }
public bool Activated { get; set; }
public bool UserRole { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<User>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>()
.ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
modelBuilder.Entity<User>()
.ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
}
}
Tenga en cuenta que no he logrado que esto funcione si la tabla actual existe. También tenga en cuenta las columnas que no se asignan, las predeterminadas se crearán.
Espero que ayude.
Puede intentar anular este método en su clase DbContext para asignarlo a la tabla que elija:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<IdentityUser>()
.ToTable("AspNetUsers");
También puede crear clases de configuración y especificar cada detalle de cada una de sus clases de identidad, por ejemplo:
using System.Data.Entity.ModelConfiguration;
public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
public UserConfig()
{
ToTable("Users");
Property(u => u.LocationName).IsRequired();
}
}
Y luego incluya estas configuraciones en el método OnModelCreating ():
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new ApplicationUserConfig());
...
}
Esto le dará un control completo sobre cada aspecto de las clases de Identidad.