Добавление ролей с одинаковыми именами для разных приложений - PullRequest
0 голосов
/ 03 сентября 2018

Я только что расширил свою IdentityRole следующим образом:

public class AspApplicationRoles : IdentityRole
{
    public AspApplicationRoles() : base() { }
    public AspApplicationRoles(String Name) : base(Name) { }
    [Required]
    public String ApplicationId { get; set; }
    public AspNetApplications Application { get; set; }
}

Затем, чтобы добавить те же имена ролей, но с другим ApplicationId, я создал собственный ролевой валидатор, например:

    public class ApplicationRoleValidator<TRole> : RoleValidator<TRole> where TRole : AspApplicationRoles
    {
        private RoleManager<TRole, string> Manager { get; set; }
        private AspApplicationRoles data = new AspApplicationRoles();
        private ApplicationDbContext dbContext = new ApplicationDbContext();

        public ApplicationRoleValidator(RoleManager<TRole, string> manager) : base(manager)
        {
            Manager = manager;
        }

        public override async Task<IdentityResult> ValidateAsync(TRole Input)
        {
            data = dbContext.AspApplicationRoles.Where(ar => ar.ApplicationId == Input.ApplicationId && ar.Name == Input.Name).SingleOrDefault();
            if (data == null)
            {
                return IdentityResult.Success;
            }
            else
            {
                return IdentityResult.Failed("Role already exists");
            }
        }
    }

Затем мне пришлось изменить свое приложение RoleManager следующим образом:

public class ApplicationRoleManager : RoleManager<AspApplicationRoles>
{
    public ApplicationRoleManager(IRoleStore<AspApplicationRoles, string> roleStore)
        : base(roleStore)
    {
        RoleValidator = new ApplicationRoleValidator<AspApplicationRoles>(this);
    }
    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        var manager = new ApplicationRoleManager(new ApplicationRoleStore(context.Get<ApplicationDbContext>()));
        return manager;
    }
}

Я также удалил уникальный ключ в таблицах базы данных следующим образом:

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

Однако у меня все еще не может быть тех же имен ролей, и я все еще получаю EntityValidationError "Менеджер ролей уже существует. Я пытался найти решение, но не могу его найти или увидеть.

EDIT:

Так я называю свой новый валидатор ролей

    public bool Save(SaveRolesDetailsViewModel Input)
    {
        bool result = false;
        AspApplicationRoles data = new AspApplicationRoles();
        var store = new ApplicationRoleStore(new ApplicationDbContext());
        var manager =new ApplicationRoleManager(store);
        try
        {
            var role = new AspApplicationRoles
            {
                Name = Input.RoleName,
                ApplicationId = Input.ApplicationId
            };
            var res = manager.RoleValidator.ValidateAsync(role);
            if (res.Result.Succeeded)
            {
                manager.Create(role);
                result = true;
            }
            else
            {
                result = false;
            }
        }
        catch (Exception e)
        {
            logger.Error(e, AspNetEventLogs.NotFound);
        }
        return result;
    }

РЕДАКТИРОВАТЬ 2:

Добавлен файл миграции, созданный после добавления OnModelCreating:

    public override void Up()
    {
        DropIndex("dbo.AspNetRoles", "RoleNameIndex");
        CreateIndex("dbo.AspNetRoles", "Name", name: "RoleNameIndex");
    }

    public override void Down()
    {
        DropIndex("dbo.AspNetRoles", "RoleNameIndex");
        CreateIndex("dbo.AspNetRoles", "Name", unique: true, name: "RoleNameIndex");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...