Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# userManager.AddToRoleAsync()-错误:角色不存在_C#_Asp.net Core_Asp.net Identity_Asp.net Identity 3 - Fatal编程技术网

C# userManager.AddToRoleAsync()-错误:角色不存在

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

我正在使用.NETCore、Identity Core和MVC Core创建一个用户注册系统。我能够在数据库中创建用户和角色

以下是视图中的表单,允许我选择用户并选择要添加的角色:

@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));