Исходные роли (RoleManager vs RoleStore)

#asp.net-mvc #entity-framework #asp.net-mvc-5 #asp.net-identity #entity-framework-migrations

#asp.net-mvc #entity-framework #asp.net-mvc-5 #asp.net-идентификация #entity-framework-миграции

Вопрос:

Просматривая сообщения здесь, я увидел два разных способа создания ASP.NET Роли идентификации посредством заполнения Entity Framework. Один способ использует RoleManager , а другой использует RoleStore . Мне было интересно, есть ли разница между ними. Поскольку использование последнего позволит избежать одной меньшей инициализации

 string[] roles = { "Admin", "Moderator", "User" };

// Create Role through RoleManager

var roleStore = new RoleStore<IdentityRole>(context);
var manager = new RoleManager<IdentityRole>(roleStore);

foreach (string role in roles)
{
    if (!context.Roles.Any(r => r.Name == role))
    {
       manager.Create(new IdentityRole(role));
    }

// Create Role through RoleStore

var roleStore = new RoleStore<IdentityRole>(context);

foreach (string role in roles)
{
    if (!context.Roles.Any(r => r.Name == role))
    {
       roleStore.CreateAsync(new IdentityRole(role));
    }
}
  

Ответ №1:

В вашем конкретном случае, используя оба метода, вы достигаете одинаковых результатов.

Но правильное использование было бы:

 var context = new ApplicationIdentityDbContext();
var roleStore = new RoleStore<IdentityRole>(context);
var roleManager = new RoleManager<IdentityRole>(roleStore);

string[] roles = { "Admin", "Moderator", "User" };

foreach (string role in roles)
{
     if (!roleManager.RoleExists(role))
     {
           roleManager.Create(new IdentityRole(role));
     }
}
  

RoleManager Это оболочка поверх RoleStore , поэтому, когда вы добавляете роли в manager, вы фактически вставляете их в хранилище, но разница здесь в том, что RoleManager можно реализовать пользовательский IIdentityValidator<TRole> механизм проверки роли.

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