【问题标题】:How do I get data for a spesific user without passing Id as paramater?如何在不将 Id 作为参数传递的情况下获取特定用户的数据?
【发布时间】:2020-03-11 15:30:08
【问题描述】:

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

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

我应该如何在我的 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;
}

【问题讨论】:

    标签: c# api uwp authorization ef-core-2.0


    【解决方案1】:

    如果您需要登录用户的项目,您可以注入 IHttpContextAccessor 并在 _httpContextAccessor.HttpContext.User 中找到您需要的内容。

    否则,将带有索引的 GUID“IdentityId”添加到用户类并使用该索引进行查询:

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

    【讨论】:

    • 所以在创建用户时生成 GUID 并在访问给定用户项目时传递它被认为是可以的?我是一名学生,正在做一个考试项目,所以我需要遵循良好的标准。
    • 是的,暴露 ID 是“不好的做法”“”。这里有一个来自 Microsoft 本身的示例,其中“Buyer”具有“IdentityGuid”属性,而用于关系的整数 ID 隐藏在 Entity 基类中。 github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/…
    【解决方案2】:

    它们是两种不同的东西。

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

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

    【讨论】:

    • 无论 ID 是数字、字符串还是 get 请求中的 GUID,问题都是相同的。我同意这通常很好。永远不要在获取请求中传递密码,但用户 ID 就可以了。
    • 这就是我说“(不是我)”的原因。但是同意你的观点,用户 ID 很好。
    • 我的观点是,使用 GUID 作为 ID 并传递它根本没有任何好处。传递密钥或直接映射到密钥(一对一)的 UUID 具有完全相同的净效果。因此我会删除这个To fix this, you may want to add a GUID column to your user table, then use that GUID instead of ID.
    • 我同意你的看法。我的观点是有人说它更安全。
    猜你喜欢
    • 2019-07-05
    • 2013-04-30
    • 1970-01-01
    • 2021-09-14
    • 2020-09-10
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多