C# userManager.AddToRoleAsync()-错误:角色不存在
我正在使用.NETCore、Identity Core和MVC Core创建一个用户注册系统。我能够在数据库中创建用户和角色 以下是视图中的表单,允许我选择用户并选择要添加的角色:C# userManager.AddToRoleAsync()-错误:角色不存在,c#,asp.net-core,asp.net-identity,asp.net-identity-3,C#,Asp.net Core,Asp.net Identity,Asp.net Identity 3,我正在使用.NETCore、Identity Core和MVC Core创建一个用户注册系统。我能够在数据库中创建用户和角色 以下是视图中的表单,允许我选择用户并选择要添加的角色: @using (Html.BeginForm("AddRoleToUser", "Roles")) { @Html.AntiForgeryToken() @Html.ValidationSummary(true) <p> Username : @Html.Drop
@using (Html.BeginForm("AddRoleToUser", "Roles"))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<p>
Username : @Html.DropDownList("UserName", (IEnumerable<SelectListItem>)ViewBag.Users, "Select ...")
Role Name: @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>)ViewBag.Roles, "Select ...")
</p>
<input type="submit" value="Save" />
}
该操作从不向用户添加角色,异常显示为“角色”ADMIN“不存在”。没有内部异常。我已经尝试将动作参数中的RoleName
转换为all caps,但仍然找不到该角色。我还尝试使用角色ID而不是名称,但也没有成功
当我使用Identity 3.0和MVC 6构建这个应用程序时,这段代码就起到了作用。在转向身份核心的过程中,似乎发生了一些变化
有什么想法吗
编辑
下面是我用来通过Viewbag填充RoleController
中的下拉列表的代码:
private void PrepopulateDropDownMenus()
{
var rolesList = _db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
var usersList = _db.Users.OrderBy(u => u.UserName).ToList().Select(uu => new SelectListItem { Value = uu.UserName.ToString(), Text = uu.UserName }).ToList();
ViewBag.Roles = rolesList;
ViewBag.Users = usersList;
}
以下是我如何在ConfigureServices
方法的Startup.cs中添加标识:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddEntityFramework()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
我还不能发表评论来问你,那么,你的错误是说用户管理员不存在,还是角色不存在?我试图复制你的代码,如果用户不存在,你会得到一个“用户不能为空”错误。但是,如果角色不存在,则会出现“角色[role]不存在”错误 我假设您已经将该角色添加到数据库中了?下面是我在seed方法中使用的一些代码,它基本上实现了您想要的功能,而不是使用视图:
// Add the Admin role to the database
IdentityResult roleResult;
bool adminRoleExists = await _roleManager.RoleExistsAsync("Admin");
if (!adminRoleExists)
{
_logger.LogInformation("Adding Admin role");
roleResult = await _roleManager.CreateAsync(new IdentityRole("Admin"));
}
// Select the user, and then add the admin role to the user
ApplicationUser user = await _userManager.FindByNameAsync("sysadmin");
if (!await _userManager.IsInRoleAsync(user, "Admin"))
{
_logger.LogInformation("Adding sysadmin to Admin role");
var userResult = await _userManager.AddToRoleAsync(user, "Admin");
}
编辑
现在添加角色的方式将角色表中的NormalizedName字段保留为null,我认为框架使用该字段向用户添加角色。尝试以下操作之一,将角色添加到数据库中,而不是您当前正在执行的操作:
var result = await _roleManager.CreateAsync(new IdentityRole(rolename));
或者,这也可能有效(但尚未测试此项):
将其直接添加到数据库是一个坏主意,违反了封装的所有概念,并且NormalizedName不应该由您自己计算 替换此代码:
var roleStore = new RoleStore<IdentityRole>(context);
await roleStore.CreateAsync(new IdentityRole(role));
var-roleStore=新的roleStore(上下文);
wait roleStore.CreateAsync(新的IdentityRole(角色));
包括:
var roleManager = services.GetService<RoleManager<IdentityRole>>();
await roleManager.CreateAsync(new IdentityRole(role));
var rolemager=services.GetService();
等待roleManager.CreateAsync(新的IdentityRole(角色));
确保在创建AspNetRole时,NormalizedName
不应为null,以使用户管理器
正常工作
NormalizedName应该是大写的,使用
.ToUpper()
感谢您的关注!错误显示“角色[角色]不存在”。我已经编辑了我的问题。我已经将角色添加到我的数据库中(下拉列表中填充了“角色”表中的数据)。答案中包含的代码对你有用吗?是的,这是我用来创建新/空数据库的实际代码,但基本原理应该是一样的。你能发布填充你的选择列表的代码吗?那么,您是如何开始将角色添加到数据库中的呢?这很有趣。我已经在上面的编辑中添加了代码。我使用数据库的Add
方法在控制器中的Create
操作中将角色添加到数据库中。这很奇怪。我复制/粘贴了你的代码,在我这方面效果很好。我知道这对你没什么帮助,但我想知道现在还能有什么帮助。您是否使用最新的.Net核心版本?startup.cs的标识部分看起来如何?我在这里挖掘,但我想复制这个问题,这与导致失败的方法相同!改用RoleManager创建角色。用我在答案中的代码(或类似的代码)替换你的代码。至少应该做到以下几点:var result=await _roleManager.CreateAsync(新IdentityRole(rolename));我认为这是因为您添加它的方式将角色表中的NormalizedName字段保留为null。或者,您可以添加参数NormalizedName=rolename.ToUpper(),这也可以解决它。我同意这是处理此情况的更好方法。我也举了一个例子,并在评论中提出了这一点。但是我没有强调直接进入数据库是一种不好的做法,所以谢谢你。这对我来说很有效,谢谢!
[HttpPost]
public IActionResult Create(string rolename)
{
_db.Roles.Add(new IdentityRole()
{
Name = rolename,
NormalizedName = rolename.ToUpper()
});
_db.SaveChanges();
ViewBag.ResultMessage = "Role created successfully!";
return RedirectToAction("Index");
}
var roleStore = new RoleStore<IdentityRole>(context);
await roleStore.CreateAsync(new IdentityRole(role));
var roleManager = services.GetService<RoleManager<IdentityRole>>();
await roleManager.CreateAsync(new IdentityRole(role));