Как заставить [Authorize (Roles = "Administrator")] работать в mvc ASP.NET Core - PullRequest
0 голосов
/ 19 июня 2019

Я готовлю приложение в ASP.NET Core (Entity Framework), где я хотел бы, чтобы некоторые функции были доступны только для определенных пользователей.

Для достижения этого в Startup.cs я добавляю следующий код обслуживание:

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole> 
().AddEntityFrameworkStores<ApplicationDbContext>();

Класс для создания новых пользователей по умолчанию:

public static class MyIdentityDataInitializer
{
    public static void SeedData(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager) 
    {
        SeedRoles(roleManager);
        SeedUsers(userManager);
    }

    public static void SeedUsers(UserManager<IdentityUser> userManager)
    {
        if (userManager.FindByNameAsync("user@email.com").Result==null)
        {
            IdentityUser user = new IdentityUser();
            user.UserName = "user@email.com";
            user.Email = "user@email.com";
            IdentityResult result = userManager.CreateAsync(user, "Admin1").Result;  //Admin1 = password

            if (result.Succeeded)
            {
                userManager.AddToRoleAsync(user, "Administrator").Wait(); //add user to role
            }
        }

    }

    public static void SeedRoles(RoleManager<IdentityRole> roleManager)
    {
        if (!roleManager.RoleExistsAsync("StandardUser").Result)
        {
            IdentityRole role = new IdentityRole();
            role.Name = "StandardUser";
            IdentityResult roleResult = roleManager.CreateAsync(role).Result;
        }

        if (!roleManager.RoleExistsAsync("Administrator").Result)
        {
            IdentityRole role = new IdentityRole();
            role.Name = "Administrator";
            role.NormalizedName = "Administrator";
            IdentityResult roleResult = roleManager.CreateAsync(role).Result;
        }
    }
}

}

и в методе Configure я называю этот класс:

MyIdentityDataInitializer.SeedData(userManager, roleManager); 

В контроллере, где я хотел бы ограничить действие

 [Authorize(Roles = "Administrator")]
    public IActionResult ConfigurationPortal()
    {
     .....
    }

Текущая ситуация:

Я могу проверить в базе данных, что пользователь и роли созданы (базы данных ASPNetUser, ASPNetRoles), также в базе данных ASPNetUserRoles существует строка, где пользователь отображается как администратор. После запуска приложения я могу войти, но когда я пытаюсь открыть ConfigurationPortal () (или другой ограниченный метод), отображается информация об ограниченном доступе. Похоже, что администратор не распознается как администратор.

Ожидаемая ситуация; когда пользователь присоединен к администратору роли, он может получить доступ к ограниченным методам.

1 Ответ

1 голос
/ 20 июня 2019

После запуска приложения я могу войти в систему, но когда я пытаюсь открыть ConfigurationPortal () (или другой ограниченный метод), отображается информация об ограниченном доступе.Похоже, что администратор не распознается как администратор.

Это известная ошибка в версии 2.1.См. выпуск здесь.

Я следую совету , используя старый API, предложенный HaoK и C-BERBER , и теперь он работает безупречно.

Вот мой DbContext:

  public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

Сконфигурируйте идентификацию, используя API старого стиля:

services.AddIdentity<IdentityUser, IdentityRole>()
        .AddRoleManager<RoleManager<IdentityRole>>()
        .AddDefaultUI()
        .AddDefaultTokenProviders()
        .AddEntityFrameworkStores<ApplicationDbContext>();

Наконец, Выйдите из системы и повторно войдите , это будет работатькак и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...