在Asp.net Identity MVC 5中创建角色


85

关于使用新的Asp.net身份安全框架的文档很少。

我拼凑了可以尝试创建的新角色并向其中添加用户的方法。我尝试了以下操作:在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));
    }
}

任何帮助表示赞赏。

Answers:


26

确认您具有MyContext班级的以下签名

public class MyContext : IdentityDbContext<MyUser>

要么

public class MyContext : IdentityDbContext

该代码为我工作,没有任何修改!


4
谢谢各位的回应。现在一切正常。检查上下文将我引向正确的方向。创建asp.net身份后,它将创建一个扩展IdentityDbContext的新上下文(ApplicationDbContext)。在我的代码中,我所引用的原始上下文没有扩展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));
Nour Lababidi '18 -10-10

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链接下载源代码。
Sheo Narayan

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)
    {
    }
}

ConfigureServicesStartup.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个错误,但是没有stacktrace)您是否能够使用此安装渲染页面?
Alex C

好的-此提交修复了白屏错误github.com/AlexChesser/AspnetIdentitySample/commit / ...请注意,在确保包内,我已将其切换为void而不是Task。
Alex C

1
有“EnsureRolesCreated”返回void可能意味着该角色不是创建配置完成之前
抛出异常

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"));

3

当我在EF 6.0中使用Peter Stulinski和Dave Gordon的代码示例时,我的应用程序挂起了。我变了:

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


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 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");
}

这将首先在您的数据库中创建一个角色,然后将新创建的用户添加到该角色。



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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.