ASP.NET MVC 5标识AddUserToRole不起作用

时间:2014-01-19 07:00:30

标签: asp.net asp.net-mvc asp.net-mvc-5

我正在尝试使用ASP.NET MVC 5 Identity插入初始用户,角色并将用户附加到角色。

当用于UserManager和RolesManager的DbContext的Configuration.AutoDetectChangesEnabled = false时,

代码userManager.AddUserToRole(user,“TestRole”)返回成功,但db中没有更新任何内容。

有没有办法在不创建自己的UserManager实现和UserStorage实现的情况下解决这个问题?

2 个答案:

答案 0 :(得分:0)

我正在使用迁移,在我的Seed方法中,我以这种方式创建角色:

private void CreateRole(string roleName)
{
    var rm = new RoleManager<IdentityRole>(
    new RoleStore<IdentityRole>(new AppDbContext()));
    var idResult = rm.Create(new IdentityRole(roleName));
}

并将角色添加到用户:

var userStore = new UserStore<AppUser>(new AppDbContext());
var manager = new UserManager<AppUser>(userStore);
var user = manager.FindByName(userName);
if ( user == null ){
   manager.Create(new AppUser { UserName = userName }, password);
}

user = manager.FindByName(userName);
manager.AddToRole(user.Id, roleName);

它会正确更新数据库。

答案 1 :(得分:0)

我的环境:
项目脚手架选择了个人用户帐户。它使用的是ASP.net MVC5,Identity 1.0 我在PrimaryApplicationContext上启用了代码优先迁移(不是在IdentityModel.cs中创建的ApplicationDbContext)

My Seed Method如下所示

protected override void Seed(MYProject.DAL.PrimaryApplicationContext context)
        {
            ApplicationDbContext userContext = new ApplicationDbContext();
            var rm = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(userContext));
            var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(userContext));

            if (!rm.RoleExists("Developer"))
            {
                var idResult = rm.Create(new IdentityRole("Developer"));
            }

            if (um.FindByName("Super") == null)
            {
                um.Create(new ApplicationUser() { UserName = "Super" } , "Password");
                ApplicationUser user = um.FindByName("Super");
                um.AddToRole(user.Id, "Developer"); 
            }

        }

如果您的应用程序使用相同的上下文来存储用户数据和应用程序数据,则不需要创建新的ApplicationDbContext,您只需使用传递给种子方法的上下文。

步骤1-创建用于存储身份数据的任何上下文的实例。

步骤2-使用步骤1上下文创建RoleManager和UserManager的实例。 *如果遇到“未启用角色管理器”之类的错误,则需要添加

  

<roleManager enabled="true" />   到您的Web.config,在节点下。

步骤3-使用角色管理器查看角色是否已存在,如果没有 - 创建角色。

步骤4-使用用户管理器查看用户是否已经存在,如果没有 - 创建它。

步骤5-创建角色和用户后,从数据库中检索用户(您需要将用户ID添加到角色中) *注意用户,角色管理器Create方法返回一个Identity Result对象,而不是角色/用户对象,因此以下代码为INVALID

var result = usermanager.Create(new ApplicationUser()...
usermanager.AddToRole( result.Id, "Developer");

步骤6-使用UserManager将检索到的用户添加到角色。 步骤7-向Package-Manager-Console发出Update-Database命令以重新设定数据库的种子。