ASP.Net Identity - Use custom Schema
public class MyDbContext : EntityDbContext<ApplicationUser>
{
public DbSet<ApplicationUser> Users { get; set; }
public MyDbContext() : base()
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// You can globally assign schema here
modelBuilder.HasDefaultSchema("schemaName");
}
}
Sorry my english, i use google translator.
Some steps indicated by Prisioner ZERO are not necessary. The indications provided are based on the standard template with individual user accounts security.
First we must verify that our project is clean (insert commands in Package Management Console):
- If you already have a database created with the default ASP.NET Identity schema, you have to delete the database with the following command (or delete directly in SQL Server) :
Drop-Database
- If you have the default migration of the ASP.NET Identity template, execute the following command to remove it:
Remove-Migration
Now that our project is clean, we must modify the ApplicationDbContext
class. We must overwrite the method OnModelCreating
to indicate the scheme to which each of the tables generated by ASP.NET Identity will belong. The following link shows the entities used to map each of the tables as well as information about custom builders and options to change the data type of the primary key of each table: Identity Model Customization.
public class ApplicationDbContext : IdentityDbContext {
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder builder) {
base.OnModelCreating(builder);
builder.Entity<IdentityUser>().ToTable("AspNetUsers", "myschema");
builder.Entity<IdentityRole>().ToTable("AspNetRoles", "myschema");
builder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims", "myschema");
builder.Entity<IdentityUserRole>().ToTable("AspNetUserRoles", "myschema");
builder.Entity<IdentityUserLogin>().ToTable("AspNetUserLogins", "myschema");
builder.Entity<IdentityRoleClaim>().ToTable("AspNetRoleClaims", "myschema");
builder.Entity<IdentityUserToken>().ToTable("AspNetUserTokens", "myschema");
}
}
Now we only have to generate our migration. For this in the Package Management Console enter the following command (optionally you can indicate the output route with the -OutputDir
parameter):
Add-Migration InitialSchemaIdentity -OutputDir Data\Migrations
Then we apply the changes in our database with the command:
Update-Database
Here is a late entry explaining what I did. Not sure if there is a better way, but this is the ONLY thing that worked for me.
To be fair, I have more than a single model in my context. Which is why this was better for me.
- Generate the tables in a database ahead of time (while tables are still in 'dbo')
- Execute
add-migration
on your project and let it create a migration - Change all the schemas within your migration code to the desired schema
- Execute
update-database
to get those changes updated - Delete your original migration file (its' hash is useless to you)
- Execute
add-migration
again and let it create a new migration - Update the
OnModelCreating
method of your configuration with the code below - Run your application and start registering users
NOTE:
You DO NOT want this.
// This globally assigned a new schema for me (for ALL models)
modelBuilder.HasDefaultSchema("security");
CONFIGURATION: OnModelCreating
This assigned a new schema for ONLY the mentioned tables
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers", "security");
modelBuilder.Entity<CustomRole>().ToTable("AspNetRoles", "security");
modelBuilder.Entity<CustomUserClaim>().ToTable("AspNetUserClaims", "security");
modelBuilder.Entity<CustomUserLogin>().ToTable("AspNetUserLogins", "security");
modelBuilder.Entity<CustomUserRole>().ToTable("AspNetUserRoles", "security");
}
INITIAL MIGRATION LOOKS LIKE
public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"security.AspNetRoles",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Name = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true, name: "RoleNameIndex");
CreateTable(
"security.AspNetUserRoles",
c => new
{
UserId = c.String(nullable: false, maxLength: 128),
RoleId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.UserId, t.RoleId })
.ForeignKey("security.AspNetRoles", t => t.RoleId, cascadeDelete: true)
.ForeignKey("security.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId)
.Index(t => t.RoleId);
CreateTable(
"security.AspNetUsers",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
FirstName = c.String(nullable: false, maxLength: 250),
LastName = c.String(nullable: false, maxLength: 250),
Email = c.String(maxLength: 256),
EmailConfirmed = c.Boolean(nullable: false),
PasswordHash = c.String(),
SecurityStamp = c.String(),
PhoneNumber = c.String(),
PhoneNumberConfirmed = c.Boolean(nullable: false),
TwoFactorEnabled = c.Boolean(nullable: false),
LockoutEndDateUtc = c.DateTime(),
LockoutEnabled = c.Boolean(nullable: false),
AccessFailedCount = c.Int(nullable: false),
UserName = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.UserName, unique: true, name: "UserNameIndex");
CreateTable(
"security.AspNetUserClaims",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserId = c.String(nullable: false, maxLength: 128),
ClaimType = c.String(),
ClaimValue = c.String(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("security.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"security.AspNetUserLogins",
c => new
{
LoginProvider = c.String(nullable: false, maxLength: 128),
ProviderKey = c.String(nullable: false, maxLength: 128),
UserId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
.ForeignKey("security.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
}
public override void Down()
{
DropForeignKey("security.AspNetUserRoles", "UserId", "security.AspNetUsers");
DropForeignKey("security.AspNetUserLogins", "UserId", "security.AspNetUsers");
DropForeignKey("security.AspNetUserClaims", "UserId", "security.AspNetUsers");
DropForeignKey("security.AspNetUserRoles", "RoleId", "security.AspNetRoles");
DropIndex("security.AspNetUserLogins", new[] { "UserId" });
DropIndex("security.AspNetUserClaims", new[] { "UserId" });
DropIndex("security.AspNetUsers", "UserNameIndex");
DropIndex("security.AspNetUserRoles", new[] { "RoleId" });
DropIndex("security.AspNetUserRoles", new[] { "UserId" });
DropIndex("security.AspNetRoles", "RoleNameIndex");
DropTable("security.AspNetUserLogins");
DropTable("security.AspNetUserClaims");
DropTable("security.AspNetUsers");
DropTable("security.AspNetUserRoles");
DropTable("security.AspNetRoles");
}
}