Asp.net mvc 未将ASP.NET角色分配给用户

Asp.net mvc 未将ASP.NET角色分配给用户,asp.net-mvc,asp.net-identity,asp.net-roles,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" }); Applicati

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

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

    ApplicationDbContext.Roles.Add(new IdentityRole()
    {
        Name = "External"
    });
    ApplicationDbContext.Roles.Add(new IdentityRole()
    {
        Name = "Internal"
    });
    ApplicationDbContext.SaveChanges();
这些角色将正确添加到aspnetRoles表中

然后,在我的内部用户AccountController中,我使用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表添加另一条记录,其中用户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);
}
它执行完全相同的操作,在DB中创建用户,并将匹配的ID添加到UserRoles表中

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

在分配角色的过程中,我是否遗漏了什么? 我想不出来

谢谢

编辑 回答/进一步问题

当使用上述方法将用户添加到角色时,users id被添加到UserRoles表的UserId列中,但有第三列名为IdentityUser_id,该列始终为null

出于好奇,我也将我的用户id添加到了该列中,现在一切都正常了。应用程序选择了我的用户角色

我的后续问题是,我可以自动设置IdentityUser_Id吗?是否使用类似于UserManager.AddToRole的方法将用户ID添加到两列


谢谢

下面是我的类似代码。我使用角色管理器创建角色:

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

您的项目也可能正在使用旧角色管理器功能。试试艾丁。。。。进入您的web.config.Under?我还注意到它有这样一个特点:对吗?这是一个标准的MVC5项目,具有不同的个人用户帐户,与身份无关。禁用角色管理器是否有帮助?好的,没有。UserManager.GetRoles仍然返回0,User.IsInRoleInternal返回FalseThank,但是我复制/粘贴了您的代码,得到了相同的结果。用户和角色是在数据库中创建的,但在添加user.Roles行并在其上断开时,user.Roles包含0。请查看web.config中是否有rolemanager引用。这里不需要任何身份2的东西。