Создание ролей в Asp.net Identity MVC 5

85

Документации об использовании новой Asp.net Identity Security Framework очень мало.

Я собрал все, что мог, чтобы попробовать создать новую роль и добавить к ней пользователя. Я пробовал следующее: Добавить роль в удостоверение ASP.NET.

похоже, он получил информацию из этого блога: создание простого приложения для выполнения с идентификатором 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));
    }
}

Любая помощь приветствуется.

colbyJax
источник

Ответы:

26

Убедитесь, что у вас есть следующая подпись вашего MyContextкласса

public class MyContext : IdentityDbContext<MyUser>

Или

public class MyContext : IdentityDbContext

Код у меня работает, без доработок !!!

jd4u
источник
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(), оно сработало.
megamaiku
var roleManager = новый RoleManager <IdentityRole> (новый RoleStore <IdentityRole> (db));
Нур Лабабиди
25

Вот полная статья, описывающая, как создавать роли, изменять роли, удалять роли и управлять ролями с помощью ASP.NET Identity. Он также содержит пользовательский интерфейс, методы контроллера и т. Д.

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

Надеюсь, это поможет

Благодарность

Шео Нараян
источник
1
Ваш блог это хорошо, но устаревают, вы можете обновить контроллер счета
Агги
Это уже для ASP.NET MVC 5 (какое обновление вы ищете, Агги?). Вы можете скачать исходный код по ссылке на GitHub, указанной в статье.
Шео Нараян
1
Некоторые из этих функций кажутся устаревшими начиная с версии 2.2.0 последней версии. 1) могу ли я использовать тот же код в текущей версии 2) как изменить первичный ключ с Guid на электронную почту 3) любые рекомендации по интеграции recpatcha с Identity будут оценены j.mp/1nohaHe
Agie
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, но без трассировки стека) Удалось ли вам отображать страницы с этим установленным?
Alex C
хорошо - этот коммит исправляет ошибку белого экрана github.com/AlexChesser/AspnetIdentitySample/commit/… обратите внимание, что в EnsureRolesCreated я переключил его на void вместо Task.
Alex C
1
наличие 'EnsureRolesCreated', возвращающее значение void, может означать, что роли не создаются до завершения настройки
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

Датчанин W
источник
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();
    }
Moji
источник
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();
    }
Джош Ятс 1980
источник
1

Если вы используете шаблон по умолчанию, который создается, когда вы выбираете новое веб-приложение ASP.net и выбираете учетные записи отдельных пользователей в качестве аутентификации и пытаетесь создать пользователей с ролями, вот решение. В методе Register контроллера учетных записей, который вызывается с помощью [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();
Кевин
источник