2017-01-23 10 views
1

Я разрабатываю многопользовательское веб-приложение с ASP.Net MVC и Identity 2.0. Я продлил IdentityRole так:Повторяющиеся имена ролей на идентификаторе и многоуровневости Asp.Net

public class ApplicationRole : IdentityRole 
{ 
    public ApplicationRole() : base() { } 
    public ApplicationRole(string name) : base(name) { } 

    public string TenantId { get; set; } 
} 

Это потому, что каждый арендатор будет иметь индивидуальные наборы ролей, как «Администратор», «Персонал» и т.д.

Но проблема в том, когда я добавить новая роль, если у «Tenant A» есть роль «Admin», когда я добавляю в «Tenant B» роль «Admin», я получаю ошибку IdentityResult, потому что имя «Admin» взято ... Это очевидно, потому что «Name» поле на столе AspNetRoles уникален ...

IdentityResult roleResult = await RoleManager.CreateAsync(
    new ApplicationRole 
    { 
    Name = "Admin", 
    TenantId = GetTenantId() 
    }); 

Но как я могу настроить ASP.Net Identi так что поле «Имя» в «AspNetRoles» может быть уникальным с «TenantId», а не только? Я нашел информацию о продлении IdentityRole (как я сделал добавление поля), но не о его изменить или заменить его ...

ответ

3

Просто изменить схему базы данных на ApplicationDbContext «s 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; 
    } 
} 

Теперь каждый раз, когда вы создаете диспетчер ролей, вы должны установить валидатор роли.

roleManager.RoleValidator=new MyRoleValidator(); 
+0

Сэм, когда я пытаюсь свое решение, команда надстройки миграции вызывает эту ошибку: Конфликтующие параметры конфигурации были указаны для столбца «Название» таблицы «IdentityRole»: Index свойство «IsUnique» = «False» атрибут конфликты с атрибутом атрибута index 'IsUnique' = 'True' –

+1

См. мое обновленное сообщение. –