c# - ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色

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

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

如您所见,角色和用户是 N 到 N,因此在内部身份创建了一个名为 UserRoles 的联结表,我的 Controller 如下所示:

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"
        }
    ]

该数据属于联结表而不是角色表本身,我不希望这样。

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

在 sql 中它会是这样的:

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

最佳答案

var user = await _userManager.FindByIdAsync(UserId);
var roles = await _userManager.GetRolesAsync(user);

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

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

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

如果你想要 Id'sRoleManager<IdentityRole>中提取或点击您的数据库上下文。

调用它 Rolesroles[] 以来,您所做的任何事情都可能会造成干扰将已经存在于 User 的返回中.

关于c# - ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45442567/

相关文章:

linq - 如何使用 LINQ 连接子查询

c# - 如何通过静默提供用户凭据来打开共享点页面

c# - 从复杂对象中获取有序列表的最佳方法是什么,其中列表元素来自第二代子集合

c# - asp-for TagHelper结合反射的使用方法

c# - 如何从 openapi 2.0 生成的对象 namespace 中删除破折号

c# - Entity Framework Core 不尊重标识列

c# - ASP.NET 具有视频和语音功能?

使用派生接口(interface)的 C# 接口(interface)实现

c# - 覆盖asp.net core 1.1中的现有数据注释属性

asp.net-core - EF7 中导航属性的更新未保存