首页 > 解决方案 > 如何使用 JwtToken 获取与特定用户相关的数据?

问题描述

我想获取属于一个特定用户的数据。如果用户未授权,我想返回 Unauthorized()。我该怎么做呢?

这是我当前的代码(目前根本没有用户处理):

public async Task<IActionResult> GetById(int id, string token)
    {
        if (!ModelState.IsValid)
            return BadRequest();

        var entity = await Context.Set<T>().FindAsync(id).ConfigureAwait(false);

        if (entity == null)
            return NotFound();

        return Ok(entity);
    }

实体与数据库中的用户有关系。并且用户有一个属性“JwtToken”。所以 entity.User.JwtToken 是可以做到的。

参数“token”是从 GET 请求中作为标头传递的 jwtToken。

标签: c#asp.netentity-frameworklinqapi

解决方案


检查自定义授权策略。您可以创建自定义策略并继续。

另一方面,您可以使用 jwt 令牌,而无需将其存储到任何数据库中。考虑以下示例:microsoft dev blogs

  1. JWT 令牌将在身份验证阶段创建
  2. JWT 令牌将在来自 web 的 get/post/put/delete 命令期间加密传输
  3. 您的 user.context 可以包含 JWT 数据和声明(如用户 ID)

然后在您的代码中,您可以执行以下操作:

    public async Task<IActionResult> GetById(int id, string token)
    {
        if (!ModelState.IsValid)
            return BadRequest();

        // Get your user id from your context here
        // Change the query to contain the user id
        var entity = await Context.Set<T>().FindAsync(id).ConfigureAwait(false);

        // If the user is authorized but there are no data for him
        // then a not found is the appropriate result
        if (entity == null)
            return NotFound();

        return Ok(entity);
    }

您无权访问呼叫而不是数据。数据对您来说不存在。如果你返回未经授权的,那么你让攻击者知道数据存在,这样他们就可以枚举你系统中的数据。


推荐阅读