c# - 如何使用 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。
解决方案
检查自定义授权策略。您可以创建自定义策略并继续。
另一方面,您可以使用 jwt 令牌,而无需将其存储到任何数据库中。考虑以下示例:microsoft dev blogs
- JWT 令牌将在身份验证阶段创建
- JWT 令牌将在来自 web 的 get/post/put/delete 命令期间加密传输
- 您的 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);
}
您无权访问呼叫而不是数据。数据对您来说不存在。如果你返回未经授权的,那么你让攻击者知道数据存在,这样他们就可以枚举你系统中的数据。
推荐阅读
- ruby-on-rails - 一对多关系:找不到“id”=3 的 Ofertum
- spring - Spring JPA 如何使用两个不同的数据库连接进行读写操作?
- if-statement - 如何更改此脚本以添加另一个条件
- python - 在odoo中使用相同字段添加多个条目
- python - 将 DataFrame 转换为系列
- python - 如何为整个django项目实现一个共享变量?
- typescript - 带有函数的 Typescript 递归接口
- python - 如何在 Django 中将一个模型对象添加到具有多对一关系的另一个模型的 ModelForm 模板中?
- python - 将文件读入 Pandas 数据框中,其中行按日期分组
- c# - 计算结果在某些数字后有偏差