Короткий ответ
Добавить IdentityRole:
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
Длинный ответ
Для правильного использования ролей / политик необходимо выполнить следующие шаги:
- настройка ApplicationDbContext для использования IdentityRole
- настройка службы идентификации для использования IdentityRole
- настройка файла cookie приложения
- определение политик авторизации
- настройка авторизации длястраницы бритвы
Примечание: если вы используете страницы бритвы, атрибуты авторизации должны быть применены к модели PageModel, а не действиям
, прежде чем приступить к решению, стоит отметить, чтоРекомендуется использовать пользовательские и ролевые модели вместо IdentityUser и IdentityModel.Это поможет вам легко добавить пользовательские поля для пользователя и роли.
Итак, сначала давайте создадим наши пользовательские модели ролей и пользователей:
public class AppUser : IdentityUser
{
//custom fields can be defined here
}
public class AppRole : IdentityRole
{
//custom fields can be defined here
}
public class AppUserRole : IdentityUserRole<string>
{
public virtual AppUser User { get; set; }
public virtual AppRole Role { get; set; }
}
Теперь мы можем начать с настройки ApplicationDbContext:
public class ApplicationDbContext : IdentityDbContext<AppUser, AppRole, string, IdentityUserClaim<string>, AppUserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
// AppUserRole relationship solution from so
// https://stackoverflow.com/questions/51004516/net-core-2-1-identity-get-all-users-with-their-associated-roles/51005445#51005445
builder.Entity<AppUserRole>(userRole =>
{
userRole.HasKey(ur => new { ur.UserId, ur.RoleId });
userRole.HasOne(ur => ur.Role)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.RoleId)
.IsRequired();
userRole.HasOne(ur => ur.User)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.UserId)
.IsRequired();
});
}
}
}
services.AddIdentity<AppUser, AppRole>(ops =>
{
ops.SignIn.RequireConfirmedEmail = true;
// Lockout settings
ops.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
ops.Lockout.MaxFailedAccessAttempts = 9;
ops.Lockout.AllowedForNewUsers = true;
// User settings
ops.User.RequireUniqueEmail = true;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
- настройка cookie приложения
services.ConfigureApplicationCookie(ops =>
{
// Cookie settings
ops.Cookie.HttpOnly = false;
ops.ExpireTimeSpan = TimeSpan.FromMinutes(30);
// If the LoginPath isn't set, ASP.NET Core defaults the path to /Account/Login.
ops.LoginPath = $"/Identity/Account/Login";
// If the AccessDeniedPath isn't set, ASP.NET Core defaults the path to /Account/AccessDenied.
ops.AccessDeniedPath = $"/Identity/Account/AccessDenied";
ops.SlidingExpiration = true;
});
- определение политик авторизации
services.AddAuthorization(ops =>
{
ops.AddPolicy("Administrator", policy =>
{
policy.RequireRole("Administrator");
});
});
Теперь можно использовать роли / политики различными способами:
1 - определять политики авторизации при запуске
services.AddMvc()
.AddRazorPagesOptions(ops =>
{
ops.Conventions.AuthorizeFolder("/", "Administrator");
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
2 - применять авторизациюатрибуты действий в случае MVC
[Authorize(Roles = "Administrator")]
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
return View();
}
3- или применение политики на PageModel для бритвенных страниц
[Authorize(Policy = "Administrator")]
public class AboutModel : PageModel
{
//-----
}
[ОБНОВЛЕНИЕ]
после вашего комментария ниже;Давайте рассмотрим, что вы разработаете панель управления новостным сайтом;в основном вам понадобятся роли, такие как администраторы для управления настройками сайта и авторы для публикации новостных страниц, и, возможно, менеджеры для утверждения опубликованных новостей.В этом сценарии вы можете выжить с настройками идентификации по умолчанию и авторизацией на основе ролей.
Но, например;если вам нужно разрешить только авторам с более чем 100 опубликованными статьями и старше 25 лет разрешать утверждать свои посты без одобрения менеджеров, вам нужно настроить IdentityUser и использовать авторизацию на основе политик / утверждений, в данном случае длинный ответпоможет вам больше в разработке приложения.
Подробнее об авторизации вы можете прочитать в документах