Asp.Net身份和多租户上的重复角色名称

时间:2017-01-23 06:16:54

标签: asp.net-mvc multi-tenant asp.net-identity-2

我正在使用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”中的“Name”字段可以与“TenantId”一起使用,而不是单独使用?我找到了关于扩展IdentityRole的信息(就像我添加了一个字段一样),但没有关于改变它或替换它......

1 个答案:

答案 0 :(得分:3)

只需在ApplicationDbContext的{​​{1}}方法上更改数据库的架构,如下所示:

OnModelCreating

但您也必须自定义protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); var role = modelBuilder.Entity<IdentityRole>() .ToTable("AspNetRoles"); role.Property(r => r.Name) .IsRequired() .HasMaxLength(256) .HasColumnAnnotation("Index", new IndexAnnotation( new IndexAttribute("RoleNameIndex") { IsUnique = false })); } 课程。因为默认角色验证器会使重复的角色名称无效。

RoleValidator

现在,每次创建角色管理器时,都必须设置角色验证器。

public class MyRoleValidator:RoleValidator<ApplicationRole>
{
     public override async Task<IdentityResult> ValidateAsync(ApplicationRole item)
     {
         // implement your validation logic here

         return IdentityResult.Success;
     }
}