【发布时间】:2022-01-07 22:52:10
【问题描述】:
我的 API 假设集合称为存储,其中包含项目 - 可以从存储中添加、编辑或删除这些项目。一个用户可以是多个存储的成员,并且可以在给定存储中具有三种可能的角色之一——编辑者、评论者和查看者。 我已经通过 JWT 实现了身份验证——现在我需要添加授权,因此某些操作只能由具有适当角色的特定存储的成员执行——例如,添加项目应该只有编辑才能执行。一开始我想到了最直接的方法——即创建自定义策略并为端点添加适当的属性:
Startup.cs
services.AddAuthorization
(
options =>
{
options.AddPolicy
(
"StorageEditor",
policy => policy.RequireClaim("StorageEditor", "{storageId}") // I need to know the id of storage request is associated with
);
}
);
ItemsController.cs
// Id of storage in question is part of the route
[HttpPost("storages/{storageId}/items")]
[Authorize(Policy = "StorageEditor")
public async Task<ActionResult> CreateItem(
[FromRoute(Name = "storageID")] int storageId)
{
return Ok();
}
但是,我需要知道 Storage 用户正在尝试修改的 id 以确定是否应该允许他这样做 - 因此,它不能在 Authorize 中硬编码基于声明的属性或策略。 显然,我可以简单地检查方法本身内部的内容 - 毕竟,它将具有执行此授权所需的所有信息。但是,这种方式给这些方法中的每一个都添加了很多样板代码,我认为这并不理想。
除了将这个逻辑放入端点方法之外,还有什么更简洁的方式来实现这种授权?
【问题讨论】:
标签: c# rest asp.net-core authorization asp.net-core-webapi