当前位置:  开发笔记 > 后端 > 正文

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

如何解决《Asp.Net身份和多租户上的角色名称重复》经验,为你挑选了1个好方法。

我正在使用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的信息(就像我确实添加了一个字段一样),但没有有关更改或替换它的信息...



1> Sam Farajpou..:

只需像这样更改ApplicationDbContextOnModelCreating方法上的数据库架构:

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();

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有