Ааа, есть некоторые изменения с ASP.NET Core версии 2.0 до 2.1.AddDefaultIdentity
является единственным.
Я не знаю, с чего начать с вашего кода, поэтому я приведу пример для создания и получения пользовательских ролей.
Давайте создадимUserRoles
first:
public enum UserRoles
{
[Display(Name = "Quản trị viên")]
Administrator = 0,
[Display(Name = "Kiểm soát viên")]
Moderator = 1,
[Display(Name = "Thành viên")]
Member = 2
}
Примечание : Вы можете удалить атрибут Display
.
Затем мы создадим RolesExtensions
class:
public static class RolesExtensions
{
public static async Task InitializeAsync(RoleManager<IdentityRole> roleManager)
{
foreach (string roleName in Enum.GetNames(typeof(UserRoles)))
{
if (!await roleManager.RoleExistsAsync(roleName))
{
await roleManager.CreateAsync(new IdentityRole(roleName));
}
}
}
}
Далее в классе Startup.cs
мы запускаем его:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
RoleManager<IdentityRole> roleManager)
{
// other settings...
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
var task = RolesExtensions.InitializeAsync(roleManager);
task.Wait();
}
Примечание : Configure
требует возвращаемый тип void
, поэтому нам нужносоздайте задачу для инициализации пользовательских ролей, и мы вызываем метод Wait
.
Не изменяйте возвращаемый тип следующим образом:
public async void Configure(...)
{
await RolesExtensions.InitializeAsync(roleManager);
}
Источник: Async / Await - Лучшие практики асинхронного программирования
В методе ConfigureServices
эти конфигурации НЕ будут работать (мы не можем правильно использовать User.IsInRole
):
services.AddDefaultIdentity<ApplicationUser>()
//.AddRoles<IdentityRole>()
//.AddRoleManager<RoleManager<IdentityRole>>()
.AddEntityFrameworkStores<ApplicationDbContext>();
Я не знаю почему, но AddRoles
и AddRoleManager
не поддерживают проверку роли для пользователя (User.IsInRole
).
В этом случае нам необходимо зарегистрироватьсясервис, как это:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
Используя этот способ, шМы создаем 3 роли пользователя в базе данных:
При регистрации нового пользователя нам просто нужно позвонить:
await _userManager.AddToRoleAsync(user, nameof(UserRoles.Administrator));
Наконец, мы можем использовать [Authorize(Roles = "Administrator")]
и:
if (User.IsInRole("Administrator"))
{
// authorized
}
// or
if (User.IsInRole(nameof(UserRoles.Administrator)))
{
// authorized
}
// but
if (User.IsInRole("ADMINISTRATOR"))
{
// authorized
}
P / S: Есть много вещей, которые необходимо реализовать для достижения этой цели.Так что, может быть, я что-то пропустил в этом примере.