如何在不将 Id 作为参数传递的情况下获取特定用户的数据?

How do I get data for a spesific user without passing Id as paramater?

我正在使用 .NET Core 2.1 SQL 数据库和 EF 核心制作 API。

我的 "Item" 模型包含一个用户,因为创建项目时它属于一个用户。

我应该如何从我的 API 中的 det 数据库查询用户的项目?我觉得在 GET 请求中将 userID 作为参数传递是一种不好的做法。

我想我需要某种令牌授权,但我在 Internet 上所能找到的只是关于对角色进行访问的信息。我需要一个用户只能访问自己的数据。

我对这一切都很陌生,所以我会很感激一个简单的解决方案。

这是我当前的代码(不是很好的做法?):

[HttpGet("{id}/items")]
public IEnumerable<Item> GetUserItems([FromRoute] int id)
{
   var items = Context.Items.Where(i => i.User.UserId == id);

   return items;
}

它们是两种不同的东西。

首先,对于某些人(不是我)来说,传递 ID 被认为是不好的。要解决此问题,您可能需要向用户添加一个 GUID 列 table,然后使用该 GUID 而不是 ID。

其次,关于允许1个用户只能访问他自己的数据。这需要一些工作。但总的来说,您需要查看基于声明的身份验证 (https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims?view=aspnetcore-3.1)。在那个 link 示例中,您可以看到他们使用 "EmployeeNumber" 声明,您可以对新的 GUID 列执行相同的操作。

如果你需要登录用户的项目,你可以注入IHttpContextAccessor并且在_httpContextAccessor.HttpContext.User你应该找到你需要的东西。

否则添加一个 GUID "IdentityId" 和用户 class 的索引并使用它查询:

context.Users.FirstOrDefault(u => u.IdentityId == guid)?.Items;