【问题标题】:ASP.Net Core how to get the user role in EF Core and IdentityASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色
【发布时间】:2018-01-08 14:25:00
【问题描述】:

您好,我正在使用 Identity 和自定义用户类和 EF Core 构建 API。 我想获取属于用户的角色的名称。 表格的图表如下(忽略用户声明和用户登录):

正如您所见,角色和用户是 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 中调用它时,我得到以下响应:

正如你在角色部分看到的那样,我得到的只是:

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

该数据属于联结表而不是角色表本身,我不想要。

我真正想要的是“真正的”角色表数据,知道如何实现吗?

在 sql 中会是这样的:

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

【问题讨论】:

标签: c# asp.net-core entity-framework-core asp.net-core-webapi


【解决方案1】:
var user = await _userManager.FindByIdAsync(UserId);
var roles = await _userManager.GetRolesAsync(user);

return OK(new { User = user, Roles = roles });

这会产生角色名称,无论哪种方式,将其返回到您的 api 调用的唯一方法是返回 ViewModel 或其他选项,因为 Chris 指出不可能直接调用。好小。

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

如果您想要 Id'sRoleManager&lt;IdentityRole&gt; 中提取它或点击您的 dbcontext。

无论你做什么都称它为Roles 可能会造成干扰,因为roles[] 已经存在于User 的返回中。

【讨论】:

    【解决方案2】:

    很遗憾,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()
    }
    

    【讨论】:

    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2016-12-09
    • 2018-09-02
    • 2017-06-25
    • 2022-11-23
    • 2020-07-21
    • 2023-03-16
    • 2021-07-25
    相关资源
    最近更新 更多