Документации об использовании новой 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));
}
}
Любая помощь приветствуется.
источник
Вот так:
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); }
источник
IdentityDbContext
а другую. Я использовал собственный контекст, поэтому, когда я использовал ваше предложениеAppilcationDbContext()
, оно сработало.Вот полная статья, описывающая, как создавать роли, изменять роли, удалять роли и управлять ролями с помощью 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Для создания новых ролей позвоните по
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
напрямую.В качестве улучшения кода Петерса, приведенного выше, вы можете использовать это:
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**));
Это имеет смысл, когда в исходном методе вы не хотите создавать другой экземпляр
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(); }
источник
Хотел поделиться еще одним решением для добавления ролей:
<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(); }
источник
Если вы используете шаблон по умолчанию, который создается, когда вы выбираете новое веб-приложение ASP.net и выбираете учетные записи отдельных пользователей в качестве аутентификации и пытаетесь создать пользователей с ролями, вот решение. В методе Register контроллера учетных записей, который вызывается с помощью [HttpPost], добавьте следующие строки в
if condition
.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"); }
Это сначала создаст роль в вашей базе данных, а затем добавит к этой роли вновь созданного пользователя.
источник
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();
источник