ASP.NET角色未分配给用户

时间:2015-05-19 23:25:41

标签: asp.net-mvc asp.net-identity asp.net-roles

我有一个网站,我想区分ASP.NET身份用户和使用角色的外部用户。

我使用以下方式创建了我的角色:

    ApplicationDbContext.Roles.Add(new IdentityRole()
    {
        Name = "External"
    });
    ApplicationDbContext.Roles.Add(new IdentityRole()
    {
        Name = "Internal"
    });
    ApplicationDbContext.SaveChanges();

这些角色会正确添加到aspnetRoles表中。

然后在我的AccountController for Internal用户中,我使用Register Post操作:

            var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };
            result = await UserManager.CreateAsync(user, model.Password);

            if (result.Succeeded)
            {
                UserManager.AddToRole(user.Id, "Internal");
                string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
...

其中一条记录添加到aspnetUsers表,另一条记录添加到aspnetUserRoles表中,其中User ID与新用户匹配,角色ID与相应的角色匹配。

然后我对我的外部注册做了同样的事情:

public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
    if (User.Identity.IsAuthenticated)
    {
        return RedirectToAction("Index", "Manage");
    }
    if (ModelState.IsValid)
    {
        // Get the information about the user from the external login provider
        var info = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (info == null)
        {
            return View("ExternalLoginFailure");
        }
        var user = new ApplicationUser { UserName = model.userName, Email = model.Email };
        var result = await UserManager.CreateAsync(user);
        if (result.Succeeded)
        {
            UserManager.AddToRole(user.Id, "External");
            result = await UserManager.AddLoginAsync(user.Id, info.Login);
            if (result.Succeeded)
            {
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                return RedirectToLocal(returnUrl);
            }
        }
        AddErrors(result);
    }
    ViewBag.ReturnUrl = returnUrl;
    return View(model);
}

完全相同的是,在数据库中创建用户并将匹配的ID添加到UserRoles表。

但是,当我使用任一方法登录并尝试导航到[Authorize(Roles="Internal")][Authorize(Roles="External")]的操作时,我无法访问它们。 我使用ApplicationUser CurrentUser = UserManager.FindByName("MyUserName");添加了一项测试 它成功地从数据库返回我的用户,但是当我说Console.WriteLine(CurrentUser.Roles);CurrentUser.Roles的计数为0,这使得它看起来没有正确分配角色。

我在分配角色过程中是否遗漏了一些内容? 我无法理解。

感谢。

修改 回答/进一步的问题......

使用上述内容将用户添加到角色时,用户ID会添加到UserId表的UserRoles列,但是第三列名为IdentityUser_Id,始终是空。

出于好奇,我也将我的用户ID添加到该列,现在一切正常。该应用程序获得了我的用户角色。

我的跟进问题是,我可以自动设置IdentityUser_Id吗?使用类似于UserManager.AddToRole()的东西,将userId添加到两列?

感谢

1 个答案:

答案 0 :(得分:0)

这是我的类似代码的样子。我使用角色管理器来创建角色:

            var roleStore = new RoleStore<IdentityRole>(db);
            var roleManager = new RoleManager<IdentityRole>(roleStore);
            var userStore = new UserStore<ApplicationUser>(db);
            var userManager = new UserManager<ApplicationUser>(userStore);

            // Add missing roles
            var role = roleManager.FindByName("External");
            if (role == null)
            {
                role = new IdentityRole("External");
                roleManager.Create(role);
            }
            role = roleManager.FindByName("Internal");
            if (role == null)
            {
                role = new IdentityRole("Internal");
                roleManager.Create(role);
            }

            // Create test users
            var user = userManager.FindByName("admin");
            if (user == null)
            {
                var newUser = new ApplicationUser()
                {
                    UserName = "admin",
                    FirstName = "Admin",
                    LastName = "User",
                    Email = "xxx.xxx@xxx.net",
                    PhoneNumber = "5555559492",
                    MustChangePassword = false
                };
                userManager.Create(newUser, "Password1");
                userManager.SetLockoutEnabled(newUser.Id, false);
                userManager.AddToRole(newUser.Id, "Internal");
            }
            user = userManager.FindByName("limited");
            if (user == null)
            {
                var newUser = new ApplicationUser()
                {
                    UserName = "limited",
                    FirstName = "Limited",
                    LastName = "User",
                    Email = "limited@mypd.com",
                    PhoneNumber = "6085555556",
                    MustChangePassword = false
                };
                userManager.Create(newUser, "Password1");
                userManager.SetLockoutEnabled(newUser.Id, false);
                userManager.AddToRole(newUser.Id, "External");
            }