Identity 2.0 UserRole пользователя всегда Null

c# asp.net-mvc-5 asp.net-identity roles user-roles

644 просмотра

1 ответ

41 Репутация автора

Так что у меня проблемы с Identity и UserRoles. Я унаследовал от базовых классов, а затем добавил несколько пользовательских полей. Пользовательский объект теперь имеет человека, от которого наследуются два других класса (Applicant и Reviewer).

Я так много пытался заставить это работать с точки зрения переупорядочения отображений таблиц в построителе моделей, удаления моих пользовательских унаследованных классов и принудительной загрузки.

Любые предложения или помощь по этому вопросу будет принята с благодарностью.

Это контекст заявителя.

 public class ApplicantContext : IdentityDbContext<User>
        {
            public ApplicantContext()
                : base("ApplicantDbConnection")
            {
                this.Configuration.LazyLoadingEnabled = true;
            }


            public DbSet<Person> People { get; set; }
            public DbSet<Applicant> Graduates { get; set; }
            public DbSet<Reviewer> Reviewers { get; set; }



            //stop pluralising generated tables
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);

                modelBuilder.Entity<User>().ToTable("Users");
                modelBuilder.Entity<Role>().HasKey<string>(r => r.Id).ToTable("Roles");
                modelBuilder.Entity<User>().HasRequired(i => i.Person).WithMany().HasForeignKey<int>(i => i.PersonID);
                modelBuilder.Entity<User>().HasMany<UserRole>((User u) => u.UserRoles);
                modelBuilder.Entity<UserRole>().HasKey(r => new { UserId = r.UserId, RoleId = r.RoleId }).ToTable("UserRoles");

                modelBuilder.Entity<IdentityUser>()
                   .ToTable("Users");

                modelBuilder.Entity<IdentityRole>()
                    .ToTable("Roles");

                modelBuilder.Entity<IdentityUserRole>()
                    .ToTable("UserRoles");

                modelBuilder.Entity<IdentityUserClaim>()
                    .ToTable("UserClaims");

                modelBuilder.Entity<IdentityUserLogin>()
                    .ToTable("UserLogins");



            }
        }

ИБ инициализатор. Со стороны базы данных все в порядке, но когда я вхожу в систему, вход в систему успешен, однако, когда он перенаправляет на Домашний контроллер Index, страница индекса использует [Authorize (Roles = "Reviewer")], и именно здесь выходит из строя. В нем говорится, что пользователь не в этой роли, однако в базе данных UserId связан с RoleID в таблице UserRoles. Поэтому роль пользователя является нулевой.

public class DataInitialiser : CreateDatabaseIfNotExists<ApplicantContext>
    {

        protected override void Seed(ApplicantContext context)
        {

            var manager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
            manager.Create(new IdentityRole("Reviewer"));
            manager.Create(new IdentityRole("Applicant"));

            ApplicationUserManager userManager = new ApplicationUserManager(new UserStore<User>(context));
            User user = new User
            {
                Person = new Reviewer
                {

                    FirstName = "Grant",
                    MiddleNames = "Mark",
                    Surname = "Weatherston",
                    OfficeID = 1,
                },
                Email = "test@test.com",
                UserName = "test@test.com",
                PhoneNumber = "0123456789",
            };

            userManager.Create(user, "Password123");
            userManager.AddToRole(user.Id, "Reviewer");

            context.SaveChanges();

            base.Seed(context);
        }

    }

Пользовательский класс ролей, наследуемый от IdentityRole.

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

    }

Пользовательский класс User наследуется от удостоверения пользователя с добавлением свойства Person.

 public class User : IdentityUser
    {
        public User() { }

        public int PersonID { get; set; }

        [ForeignKey("PersonID")]
        public virtual Person Person { get; set; }

        public virtual ICollection<UserRole> UserRoles {get;set;}

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
    }

Пользовательский класс ролей пользователей.

    public class UserRole : IdentityUserRole
        {

        }

Пользовательский менеджер ролей.

public class ApplicationRoleManager : RoleManager<IdentityRole>
    {

        public ApplicationRoleManager(RoleStore<IdentityRole> roleStore)
            : base(roleStore)
        {

        }

    }

Пользовательский UserManager

public class ApplicationUserManager : UserManager<User>
    {
        public ApplicationUserManager(IUserStore<User> store)
            : base(store)
        {
        }

   }
Автор: rugbylad_28 Источник Размещён: 18.07.2016 11:28

Ответы (1)


0 плюса

6 Репутация автора

Это немного из-за необходимости, но я решил эту проблему, добавив следующую строку прямо перед userIdentityобъявлением:

await manager.UpdateSecurityStampAsync(this.Id);

Где managerпримерUserManager

Это сбрасывает штамп безопасности с идентификатором текущего пользователя.

Автор: Ali Prasla Размещён: 22.04.2017 10:50
Вопросы из категории :
32x32