Створення ролей в Asp.net Identity MVC 5


85

Існує дуже мало документації про використання нової Asp.net Identity Security Framework.

Я зібрав усе, що міг спробувати створити нову Роль та додати до неї Користувача. Я спробував наступне: Додати роль в ASP.NET Identity

схоже, що це могло отримати інформацію з цього блогу: створення простого додаткового завдання з ідентифікацією asp.net та асоціювання користувачів із завданнями

Я додав код до Ініціалізатора баз даних, який запускається щоразу, коли модель змінюється. RoleExistsФункція виходить з ладу з такою помилкою:

System.InvalidOperationException відбулося в mscorlib.dll Тип сутності IdentityRole не є частиною моделі для поточного контексту.

protected override void Seed (MyContext context)
{
    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 
    var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

    // Create Admin Role
    string roleName = "Admins";
    IdentityResult roleResult;

    // Check to see if Role Exists, if not create it
    if (!RoleManager.RoleExists(roleName))
    {
        roleResult = RoleManager.Create(new IdentityRole(roleName));
    }
}

Будь-яка допомога вдячна.

Відповіді:


26

Переконайтеся, що у вас є підпис вашого MyContextкласу

public class MyContext : IdentityDbContext<MyUser>

Або

public class MyContext : IdentityDbContext

Код працює для мене, без будь-яких змін !!!


4
Дякую всім за відповіді. Зараз все працює. Перевірка контексту привела мене в правильному напрямку. Коли створюється ідентичність asp.net, він створює новий контекст (ApplicationDbContext), який розширює IdentityDbContext. У своєму коді я посилався на свій початковий контекст, який не поширював IdentityDbContext. Якщо у когось ще є ця проблема, перевірте ваш контекст і перевірте каталог APP_DATA, щоб переконатися, що ви випадково не створюєте дві бази даних.
colbyJax

74

Ось і ми:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));


   if(!roleManager.RoleExists("ROLE NAME"))
   {
      var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();
      role.Name = "ROLE NAME";
      roleManager.Create(role);

    }

2
Це мені допомогло, тим більше, що я не використовував Міграції. Я використовую DropCreateDatabaseAlways.
J86

Моя проблема полягала в тому, що я використовував неправильний контекст. Я створив два рядки підключення, один викликаний IdentityDbContextі інший, який я використовував власний контекст, тому, коли я використав вашу пропозицію AppilcationDbContext(), це спрацювало.
Мегамайку

var roleManager = новий RoleManager <IdentityRole> (новий RoleStore <IdentityRole> (db));
Nour Lababidi

25

Ось повна стаття, яка описує, як створювати ролі, змінювати ролі, видаляти ролі та керувати ролями за допомогою ідентифікації ASP.NET. Це також містить інтерфейс користувача, методи контролера тощо.

http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc

Сподіваюся, це допоможе

Дякую


1
Ваш блог приємний, але застарілий, чи можете ви оновити контролер облікового запису
aggie

Це вже для ASP.NET MVC 5 (яке оновлення ви шукаєте для aggie?). Ви можете завантажити вихідний код із посилання GitHub, зазначеного в статті.
Шео Нараян

1
Деякі з цих функцій, здається, застаріли від останньої версії 2.2.0. 1) чи можу я використовувати той самий код у поточній версії 2) як я можу змінити первинний ключ з Guid на електронну пошту 3) будь-які рекомендації щодо інтеграції recpatcha з Identity будуть вдячні j.mp/1nohaHe
aggie

15

У ASP.NET 5 rc1-final, я зробив наступне:

Створено ApplicationRoleManager(подібним чином, як це ApplicationUserстворено за допомогою шаблону)

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(
        IRoleStore<IdentityRole> store,
        IEnumerable<IRoleValidator<IdentityRole>> roleValidators,
        ILookupNormalizer keyNormalizer,
        IdentityErrorDescriber errors,
        ILogger<RoleManager<IdentityRole>> logger,
        IHttpContextAccessor contextAccessor)
        : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
    {
    }
}

До ConfigureServicesін Startup.cs, я додав його в якості RoleManager

services.
    .AddIdentity<ApplicationUser, IdentityRole>()
    .AddRoleManager<ApplicationRoleManager>();

Для створення нових ролей зателефонуйте за Configureадресою:

public static class RoleHelper
{
    private static async Task EnsureRoleCreated(RoleManager<IdentityRole> roleManager, string roleName)
    {
        if (!await roleManager.RoleExistsAsync(roleName))
        {
            await roleManager.CreateAsync(new IdentityRole(roleName));
        }
    }
    public static async Task EnsureRolesCreated(this RoleManager<IdentityRole> roleManager)
    {
        // add all roles, that should be in database, here
        await EnsureRoleCreated(roleManager, "Developer");
    }
}

public async void Configure(..., RoleManager<IdentityRole> roleManager, ...)
{
     ...
     await roleManager.EnsureRolesCreated();
     ...
}

Тепер правила можна призначити користувачеві

await _userManager.AddToRoleAsync(await _userManager.FindByIdAsync(User.GetUserId()), "Developer");

Або використовується в Authorizeатрибуті

[Authorize(Roles = "Developer")]
public class DeveloperController : Controller
{
}

services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>() Я не зміг додати його servicesбезпосередньо.
Alex C

2
@AlexC, Вибачте, погано. Я намагався зробити це максимально простим і видалив AddIdentity. Виправлено.
nothrow

1
Отже, я додав цей код до автономного проекту github.com/AlexChesser/AspnetIdentitySample/commit/… та AspnetRoles успішно створюються, але з якоїсь причини сторінки стають "білими" (я вважаю помилку 500, але no stacktrace) чи змогли ви відтворити сторінки з цим встановленим?
Alex C

гаразд - цей коміт виправляє помилку білого екрану github.com/AlexChesser/AspnetIdentitySample/commit/ ... зверніть увагу, що в межах EnsureRolesCreated я перевів її на порожнечу замість Task.
Alex C

1
наявність повернення порожнечі 'EnsureRolesCreated' може означати, що ролі не створюються до завершення налаштування
nothrow

6

Як вдосконалення коду Пітерса вище ви можете використовувати це:

   var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

   if (!roleManager.RoleExists("Member"))
            roleManager.Create(new IdentityRole("Member"));

3

Моя програма зависала під час запуску, коли я використовував зразки коду Пітера Стулінського та Дейва Гордона з EF 6.0. Я змінився:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

до

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(**context**));

Це має сенс, коли в насіннєвому методі ви не хочете створювати інший екземпляр ApplicationDBContext. Це могло бути ускладнено тим фактом, який я мав Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());у конструкторіApplicationDbContext


2

Модель перегляду ролей

public class RoleViewModel
{
    public string Id { get; set; }
    [Required(AllowEmptyStrings = false)]
    [Display(Name = "RoleName")]
    public string Name { get; set; }
}

Метод контролера

    [HttpPost]
    public async Task<ActionResult> Create(RoleViewModel roleViewModel)
    {
       if (ModelState.IsValid)
       {
           var role = new IdentityRole(roleViewModel.Name);
           var roleresult = await RoleManager.CreateAsync(role);
           if (!roleresult.Succeeded)
           {
               ModelState.AddModelError("", roleresult.Errors.First());
               return View();
           }
           return RedirectToAction("some_action");
       }
       return View();
    }

1

Я хотів поділитися ще одним рішенням для додавання ролей:

<h2>Create Role</h2>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<span class="label label-primary">Role name:</span>
<p>
    @Html.TextBox("RoleName", null, new { @class = "form-control input-lg" })
</p>
<input type="submit" value="Save" class="btn btn-primary" />
}

Контролер:

    [HttpGet]
    public ActionResult AdminView()
    {
        return View();
    }

    [HttpPost]
    public ActionResult AdminView(FormCollection collection)
    {
        var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

        if (roleManager.RoleExists(collection["RoleName"]) == false)
        {
            Guid guid = Guid.NewGuid();
            roleManager.Create(new IdentityRole() { Id = guid.ToString(), Name = collection["RoleName"] });
        }
        return View();
    }

1

Якщо ви використовуєте шаблон за замовчуванням, який створюється, коли ви вибираєте нову веб-програму ASP.net та вибираєте Облікові записи індивідуальних користувачів як Аутентифікацію та намагаєтеся створити користувачів за Ролями, то ось рішення. У метод реєстру контролера облікового запису, який викликається за допомогою [HttpPost], додайте наступні рядки в if condition.

використання Microsoft.AspNet.Identity.EntityFramework;

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };

var result = await UserManager.CreateAsync(user, model.Password);

if (result.Succeeded)
{
  var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
  var roleManager = new RoleManager<IdentityRole>(roleStore);
  if(!await roleManager.RoleExistsAsync("YourRoleName"))
     await roleManager.CreateAsync(new IdentityRole("YourRoleName"));

  await UserManager.AddToRoleAsync(user.Id, "YourRoleName");
  await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
  return RedirectToAction("Index", "Home");
}

Це створить спочатку створення ролі у вашій базі даних, а потім додасть новоствореного користувача до цієї ролі.


0
    public static void createUserRole(string roleName)
    {
        if (!System.Web.Security.Roles.RoleExists(roleName))
        {
            System.Web.Security.Roles.CreateRole(roleName);
        }
    }

0

нижче наведено метод, який я використовую для створення ролей, а також присвоєння їм користувачів у коді. наведений нижче код знаходиться у "configuration.cs" у папці міграцій.

string [] roleNames = { "role1", "role2", "role3" };
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

                IdentityResult roleResult;
                foreach(var roleName in roleNames)
                {
                    if(!RoleManager.RoleExists(roleName))
                    {
                        roleResult = RoleManager.Create(new IdentityRole(roleName));
                    }
                }
                var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
                UserManager.AddToRole("user", "role1");
                UserManager.AddToRole("user", "role2");
                context.SaveChanges();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.