首页 文章

ASP.Net Core如何在EF Core和Identity中获得用户角色

提问于
浏览
1

嗨,我正在使用Identity与自定义用户类和EF Core构建API . 我想获取属于用户的角色的名称 . 表的图表如下(忽略userclaims和userlogins):
enter image description here

正如您所看到的,角色和用户是N到N,因此内部Identity创建了一个名为UserRoles的联结表,我的控制器如下所示:

Route ("api/[controller]")]
    public class UserController : Controller {
        private readonly DBContext _db;
        private readonly UserManager<Usuario> _userManager;
        public UserController (DBContext db, UserManager<Usuario> userManager) {
            this._db = db;
        }
        [HttpGet ("GetUserById/{id}", Name = "GetUserById")]
        public async Task<IActionResult> GetUserById (string id) {
            try {

                var user = await this._db.Users.Where (x => x.Id == id).Include (x => x.Roles).FirstOrDefaultAsync ();
                if (user == null) {
                    return NotFound ();
                }
                return Ok (user);
            } catch (Exception e) {
                Console.WriteLine (e.Message);
                return BadRequest ();
            }
        }

当我在Postman中调用它时,我收到以下响应:

enter image description here

正如您在角色部分中看到的,我得到的是:

"roles": [
        {
            "userId": "d88b0c2d-25c5-4da9-ad05-45f69dec67ff",
            "roleId": "a83a60ca-f011-43ce-be3d-8b71403aa86e"
        }
    ]

那个数据属于联结表而不是Role表本身,我不想要那样 .

我真正想要的是“真正的”角色表数据,任何想法我该如何实现?

在sql中它将是这样的:

select *
    from AspNetUsers as a,AspNetUserRoles as b,AspNetRoles as c 
    where a.Id = b.UserId and b.RoleId= c.Id

2 回答

  • 3
    var user = await _userManager.FindByIdAsync(UserId);
    var roles = await _userManager.GetRolesAsync(user);
    
    return OK(new { User = user, Roles = roles });
    

    这会产生角色名称,无论哪种方式,将此回到你的api调用的唯一方法是返回一个ViewModel或其他选项,因为Chris指出它不可能直接调用..它如此圆周即可实现这么小的东西 .

    无论如何,这是第二个获取“角色”名称而无需触及数据库上下文的选项 .

    如果你想从 RoleManager<IdentityRole> 拉出 Id's 或点击你的dbcontext .

    在你所做的事情中调用 Roles 可能会造成干扰,因为 roles[] 已经存在于 User 的返回中 .

  • 7

    不幸的是, UserRole 上没有导航属性,所以它需要做类似的事情:

    var userRoleIds = user.Roles.Select(r => r.RoleId);
    var roles = db.Roles.Where(r => userRoleIds.Contains(r.Id));
    

    然后,您可以通过视图模型将这些映射到用户 . 例如:

    public class UserViewModel
    {
        ...
        public List<string> Roles { get; set; }
    }
    

    然后:

    var model = new UserViewModel
    {
        ...
        Roles = roles.Select(r => r.Name).ToList()
    }
    

相关问题