我正在使用ASP.Net MVC和Identity 2.0开发多租户Web应用程序。我已经这样扩展了IdentityRole:
public class ApplicationRole : IdentityRole { public ApplicationRole() : base() { } public ApplicationRole(string name) : base(name) { } public string TenantId { get; set; } }
这是因为每个租户都有各自的角色集,例如“管理员”,“工作人员”等。
但是问题是,当我添加新角色时,如果“租户A”具有“管理员”角色,则当我向“租户B”添加“管理员”角色时,由于使用了“管理员”名称,因此我收到IdentityResult错误...这很明显,因为AspNetRoles表上的“名称”字段是唯一的...
IdentityResult roleResult = await RoleManager.CreateAsync( new ApplicationRole { Name = "Admin", TenantId = GetTenantId() });
但是,然后我如何自定义ASP.Net Identity,以便“ AspNetRoles”中的“名称”字段可以与“ TenantId”一起唯一,而不是单独?我发现了有关扩展IdentityRole的信息(就像我确实添加了一个字段一样),但没有有关更改或替换它的信息...
只需像这样更改ApplicationDbContext
的OnModelCreating
方法上的数据库架构:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); var role = modelBuilder.Entity() .ToTable("AspNetRoles"); role.Property(r => r.Name) .IsRequired() .HasMaxLength(256) .HasColumnAnnotation("Index", new IndexAnnotation( new IndexAttribute("RoleNameIndex") { IsUnique = false })); }
但是您还必须自定义RoleValidator
类。因为默认角色验证程序会使重复的角色名称无效。
public class MyRoleValidator:RoleValidator{ public override async Task ValidateAsync(ApplicationRole item) { // implement your validation logic here return IdentityResult.Success; } }
现在,每次创建角色管理器时,都必须设置角色验证器。
roleManager.RoleValidator=new MyRoleValidator();