2017-01-23 4 views
1

ASP.Net MVC 및 ID 2.0으로 다중 소유 웹 응용 프로그램을 개발 중입니다. 나는이 같은 IdentityRole을 확장 한 : 각 임차인 등Asp.Net ID 및 다중 소유에 대한 중복 역할 이름

"관리자", "직원"과 같은 역할의 개별 집합이있을 것이다 그러나 나는를 추가 할 때 문제가있다

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

    public string TenantId { get; set; } 
} 

이 있기 때문에 새로운 역할 "Tenant B"에 "Admin"역할을 추가 할 때 "Tenant A"에 "Admin"역할이있는 경우 "Admin"이름을 사용하기 때문에 IdentityResult 오류가 발생합니다. AspNetRoles 테이블의 "이름"필드 ...

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

고유하지만 내가 ASP.Net 확인 시험을 사용자 정의 할 수있는 방법 그래서 "AspNetRoles"의 "Name"필드는 "TenantId"와 유일 할 수 있습니다.

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 })); 
} 
: 나는 정보에 대한

답변

3

단순히 OnModelCreating 방법과 같이 ApplicationDbContext의에 데이터베이스의 스키마를 변경 ... 약을 변경하거나 대체 (나는 필드를 추가 않았다 같은) IdentityRole을 확장,하지만 발견

그러나 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'에 열 '이름'지정되었습니다 : 인덱스 재산 'isUnique에'= '거짓'속성 인덱스 속성 속성 'IsUnique'= 'True'와의 충돌 –

+1

업데이트 된 게시물보기 –