ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色
Posted
技术标签:
【中文标题】ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色【英文标题】:ASP.Net Core how to get the user role in EF Core and 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
【问题讨论】:
微软官方文档中也解释了一个解决方案:docs.microsoft.com/en-us/aspnet/core/security/authentication/… 【参考方案1】:var user = await _userManager.FindByIdAsync(UserId);
var roles = await _userManager.GetRolesAsync(user);
return OK(new User = user, Roles = roles );
这会产生角色名称,无论哪种方式,将其返回到您的 api 调用的唯一方法是返回 ViewModel 或其他选项,因为 Chris 指出不可能直接调用。好小。
无论如何,这是获得“角色”名称的第二个选项,而无需触及您的数据库上下文。
如果您想要 Id's
从 RoleManager<IdentityRole>
中提取它或点击您的 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()
【讨论】:
这里你可以找到这样的UserRole
配置github.com/aspnet/Identity/issues/1361#issuecomment-348863959的详细信息以上是关于ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介
如何使用 EF Core 代码优先迁移为 ASP.NET Core MVC 配置 N 层架构
如何在现有数据库 ASP.NET Core MVC 和 EF Core(DB-First)中使用 Identity