Создание ролей в Asp.net Identity MVC 5
Существует очень мало документации об использовании новой 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));
}
}
Любая помощь приветствуется.
10 ответов
Убедитесь, что у вас есть следующая подпись вашего MyContext
учебный класс
public class MyContext : IdentityDbContext<MyUser>
Или же
public class MyContext : IdentityDbContext
Код работает для меня, без каких-либо изменений!
Вот так:
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);
}
Вот полная статья, описывающая, как создавать роли, изменять роли, удалять роли и управлять ролями с помощью ASP.NET Identity. Это также содержит пользовательский интерфейс, методы контроллера и т. Д.
http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc
Надеюсь это поможет
Спасибо
В 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
{
}
В качестве улучшения кода Peters выше вы можете использовать это:
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
if (!roleManager.RoleExists("Member"))
roleManager.Create(new IdentityRole("Member"));
Мое приложение зависало при запуске, когда я использовал примеры кода Питера Стулински и Дэйва Гордона с 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**));
Что имеет смысл, когда в методе seed вы не хотите создавать экземпляр другого экземпляра ApplicationDBContext
, Это могло быть усугублено тем, что я имел Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
в конструкторе ApplicationDbContext
Роли Посмотреть Модель
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();
}
Если вы используете шаблон по умолчанию, который создается при выборе нового веб-приложения ASP.net и выборе отдельных учетных записей пользователей в качестве аутентификации и при попытке создания пользователей с ролями, вот решение. В методе Register Account Controller, который вызывается с помощью [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");
}
Это создаст сначала создание роли в вашей базе данных, а затем добавит вновь созданного пользователя в эту роль.
Я хотел бы поделиться другим решением для добавления ролей:
<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();
}
public static void createUserRole(string roleName)
{
if (!System.Web.Security.Roles.RoleExists(roleName))
{
System.Web.Security.Roles.CreateRole(roleName);
}
}
Метод, который я использую для создания ролей, приведен ниже, также их назначение пользователям в коде. приведенный ниже код находится в "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();