我有一个网站,我想区分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添加到两列?
感谢
答案 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");
}