c# – userManager.AddToRoleAsync() – 错误:角色不存在

前端之家收集整理的这篇文章主要介绍了c# – userManager.AddToRoleAsync() – 错误:角色不存在前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用.NET Core,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”的角色,这个表单让我选择字符串“admin”.

这是处理向用户添加角色的操作:

[HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> AddRoleToUser(string UserName,string RoleName)
    {
        try
        {
            ApplicationUser user = _db.Users.Where(u => u.UserName.Equals(UserName,StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
            await _userManager.AddToRoleAsync(user,RoleName);
            PrepopulateDropDownMenus();
            ViewBag.ResultMessage = "Role created successfully!";
            return View("Manage","Roles");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return View("Manage");
        }
    }

该操作永远不会将该角色添加用户,并且该异常显示“Role”ADMIN“不存在”.没有内在的例外.我已经尝试将action参数中的RoleName转换为all-caps,但它仍然找不到该角色.我也尝试使用角色ID而不是名称,这也是不成功的.

当我使用带有MVC 6的Identity 3.0构建这个应用程序时,这个确切的代码工作.似乎有些东西在转移到Identity Core时发生了变化.

有什么想法吗?

编辑

这是我用来通过Viewbag填充RolesController中的下拉列表的代码

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中添加Identity的方法

public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddEntityFramework()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UsesqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
        services.AddIdentity<ApplicationUser,IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
    }

这是RolesController.cs中的路由,用于在数据库中创建新角色:

[HttpPost]
    public IActionResult Create(string rolename)
    {
            _db.Roles.Add(new IdentityRole()
            {
                Name = rolename
            });
            _db.SaveChanges();
            ViewBag.ResultMessage = "Role created successfully!";
            return RedirectToAction("Index");
    }

解决方法

我还不能发表评论问你,那么,你的错误是说用户管理员不存在,还是角色不存在?我试图在我的最后复制你的代码,如果用户不存在,你将得到一个“用户不能为空”的错误.但是,如果该角色不存在,您将获得“角色[角色]不存在”错误.

我假设您已将角色添加数据库中?以下是我在种子方法中使用的一些代码,基本上可以执行您想要的操作,减去使用视图执行的操作:

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

编辑

你现在添加角色的方式使Role表中的NormalizedName字段为null,我认为框架用它来向用户添加角色.尝试以下操作之一将角色添加数据库而不是您当前正在执行的操作:

var result = await _roleManager.CreateAsync(new IdentityRole(rolename));

或者这可能也有效(虽然没有测试过这个):

[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");
}
原文链接:https://www.f2er.com/csharp/94552.html

猜你在找的C#相关文章