关于使用新的Asp.net身份安全框架的文档很少。
我已经拼凑了我可以尝试创建新角色并向其添加用户。我尝试了以下内容:Add role in ASP.NET Identity
看起来它可能从这个博客获得了信息:building a simple to-do application with asp.net identity and associating users with to-does
我已将代码添加到数据库初始化程序,该数据库初始化程序在模型更改时运行。它在RoleExists
函数上失败,并出现以下错误:
mscorlib.dll中发生了
System.InvalidOperationException
实体类型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));
}
}
感谢任何帮助。
答案 0 :(得分:70)
我们走了:
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);
}
答案 1 :(得分:25)
以下是完整的文章,介绍如何使用ASP.NET Identity创建角色,修改角色,删除角色和管理角色。这还包含用户界面,控制器方法等。
http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc
希望这个帮助
由于
答案 2 :(得分:23)
确认您拥有MyContext
班级
public class MyContext : IdentityDbContext<MyUser>
或
public class MyContext : IdentityDbContext
代码正在为我工作,没有任何修改!!!
答案 3 :(得分:14)
在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
{
}
答案 4 :(得分:6)
作为上述Peters代码的改进,您可以使用:
var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
if (!roleManager.RoleExists("Member"))
roleManager.Create(new IdentityRole("Member"));
答案 5 :(得分:3)
我使用Peter Stulinski&amp; amp; Dave Gordon使用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
这个事实可能会加剧这种情况。
答案 6 :(得分: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();
}
答案 7 :(得分: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();
}
答案 8 :(得分:0)
public static void createUserRole(string roleName)
{
if (!System.Web.Security.Roles.RoleExists(roleName))
{
System.Web.Security.Roles.CreateRole(roleName);
}
}
答案 9 :(得分: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();
答案 10 :(得分:0)
如果您使用的是在选择新的ASP.net Web应用程序并选择“个人用户”帐户作为“身份验证”并尝试创建具有角色的用户时创建的默认模板,那么这里就是解决方案。在使用[HttpPost]调用的帐户控制器的Register方法中,在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");
}
这将首先在您的数据库中创建一个角色,然后将新创建的用户添加到该角色中。