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

C# 在Asp.net Identity MVC 5中创建角色,c#,asp.net-mvc-5,asp.net-identity,C#,Asp.net Mvc 5,Asp.net Identity,关于使用新的Asp.net身份安全框架的文档很少 我已经拼凑了我所能做的,尝试创建一个新角色,并向其中添加一个用户。我尝试了以下方法: 看起来它可能从这个博客中得到了信息: 我已将代码添加到数据库初始值设定项中,该初始值设定项在模型更改时运行。它在RoleExists功能上失败,出现以下错误: mscorlib.dll中发生系统.InvalidOperationException 实体类型IdentityRole不是当前上下文模型的一部分 受保护的覆盖无效种子(MyContext上下文) { v

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

我已经拼凑了我所能做的,尝试创建一个新角色,并向其中添加一个用户。我尝试了以下方法:

看起来它可能从这个博客中得到了信息:

我已将代码添加到数据库初始值设定项中,该初始值设定项在模型更改时运行。它在
RoleExists
功能上失败,出现以下错误:

mscorlib.dll中发生系统.InvalidOperationException 实体类型IdentityRole不是当前上下文模型的一部分

受保护的覆盖无效种子(MyContext上下文)
{
var UserManager=newusermanager(newuserstore(context));
var角色管理器=新角色管理器(新角色存储(上下文));
//创建管理员角色
字符串roleName=“Admins”;
识别结果角色结果;
//检查角色是否存在,如果不存在,请创建它
如果(!RoleManager.RoleExists(roleName))
{
roleResult=RoleManager.Create(新的IdentityRole(roleName));
}
}

感谢您的帮助。

请验证您是否有MyContext类的以下签名

公共类MyContext:IdentityDbContext

公共类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);

    }

var rolemager=new rolemager(new RoleStore(new ApplicationDbContext());
如果(!roleManager.RoleExists(“角色名称”))
{
var role=new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();
role.Name=“role Name”;
角色管理器。创建(角色);
}

作为上述彼得斯代码的改进,您可以使用以下代码:

   var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

   if (!roleManager.RoleExists("Member"))
            roleManager.Create(new IdentityRole("Member"));

var rolemager=new rolemager(new RoleStore(new ApplicationDbContext());
如果(!roleManager.RoleExists(“成员”))
roleManager.Create(新身份文件(“成员”);

这是一篇完整的文章,介绍了如何使用ASP.NET标识创建角色、修改角色、删除角色和管理角色。它还包含用户界面、控制器方法等

希望这能有所帮助


谢谢

我想分享另一个添加角色的解决方案:

<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" />
}
创建角色
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
角色名称:

@TextBox(“RoleName”,null,新{@class=“form control input lg”})

}
控制器:

    [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();
    }
[HttpGet]
公共操作结果AdminView()
{
返回视图();
}
[HttpPost]
公共操作结果AdminView(FormCollection集合)
{

var rolemanger=new rolemanger(new RoleStore(new ApplicationDbContext()); if(roleManager.RoleExists(集合[“RoleName”])==false) { Guid=Guid.NewGuid(); Create(新的IdentityRole(){Id=guid.ToString(),Name=collection[“RoleName”]}); } 返回视图(); }
当我将Peter Stulinski和Dave Gordon的代码示例用于EF 6.0时,我的应用程序在启动时挂起。我改变了:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

var rolemager=new rolemager(new RoleStore(new ApplicationDbContext());


var rolemanger=newrolemanger(newrolestore(**context**));
在seed方法中,如果您不想实例化另一个
ApplicationDBContext
实例,这是有意义的。我有
Database.SetInitializer(新的ApplicationBinInitializer())
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();
    }
[HttpPost]
公共异步任务创建(RoleViewModel RoleViewModel)
{
if(ModelState.IsValid)
{
var role=新的标识符(roleViewModel.Name);
var roleresult=await RoleManager.CreateAsync(角色);
如果(!roleresult.successed)
{
ModelState.AddModelError(“,roleresult.Errors.First());
返回视图();
}
返回重定向到操作(“某些操作”);
}
返回视图();
}

ASP.NET 5 rc1 final
中,我做了以下几点:

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();
     ...
}
创建
ApplicationRoleManager
(与模板创建的
ApplicationUser
的方式类似)

要创建新角色,请从以下位置调用
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();
     ...
}
或用于
授权
属性

[Authorize(Roles = "Developer")]
public class DeveloperController : Controller
{
}

下面是我用于创建角色的方法,还列出了在代码中将角色分配给用户的方法。下面的代码确实位于migrations文件夹的“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();
string[]roleNames={“role1”、“role2”、“role3”};
var角色管理器=新角色管理器(新角色存储(上下文));
识别结果角色结果;
foreach(roleName中的变量roleName)
{
如果(!RoleManager.RoleExists(roleName))
{
roleResult=RoleManager.Create(新的IdentityRole(roleName));
}
}
var UserManager=newusermanager(newuserstore(context));
UserManager.AddToRole(“用户”、“角色1”);
UserManager.AddToRole(“用户”、“角色2”);
SaveChanges();

如果您使用默认模板,该模板是在您选择新的ASP.net Web应用程序并选择单个用户帐户作为身份验证并尝试创建具有角色的用户时创建的,那么下面是解决方案。在使用[HttpPost]调用的帐户控制器的注册方法中,如果条件
,则在
中添加以下行

使用Microsoft.AspNet.Identity.EntityFramework

var user=newapplicationuser{UserName=model.Email,Email=model.Email};
var result=await UserManager.CreateAsync(用户、模型、密码);
if(result.successed)
{
瓦罗莱斯托
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(Roles = "Developer")]
public class DeveloperController : Controller
{
}
    public static void createUserRole(string roleName)
    {
        if (!System.Web.Security.Roles.RoleExists(roleName))
        {
            System.Web.Security.Roles.CreateRole(roleName);
        }
    }
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();
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");
}