Asp.net mvc 未将ASP.NET角色分配给用户
我有一个网站,我想区分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
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的东西。