c# - 如何在 ASP.NET Core 中创建基于模块的权限
问题描述
我已经查看了基于策略的授权,但我认为它不适合我的需要。
我有一个 ASP.NET Core Web API 应用程序,它控制具有不同部分的客户端(移动和 Web),这些部分称为模块
- 用户管理(CanView、CanUpdate、CanAdd、CanExport)
- 事务(CanView、CanUpdate、CanAdd、CanExport、CanProcessReversal)等。
Web API 中的每个端点都将具有某些端点所需的所有这些权限。
例子是
//Permission Required UserManagement(CanView)
[HttpGet("{page}/{pageSize}")]
public async Task<IActionResult> GetUsers(int page, int pageSize)
{
// Do something
}
// I would want it to be dressed like this
[HasPermission(Module.UserManagement, Permission.CanView)]
[HttpGet("{page}/{pageSize}")]
public async Task<IActionResult> GetUsers(int page, int pageSize)
{
// Do something
}
我能够使用的实现是这样的
[HttpPost]
public async Task<ActionResult<Response<ManualAccountDebitModel>>> Post(ManualAccountDebitViewModel model)
{
try
{
if (!ModelState.IsValid)
{
var errors = new List<string>();
errors = ModelState.Values.SelectMany(c => c.Errors.Select(d => d.ErrorMessage)).ToList();
var modelResponse = Response<ManualAccountDebitModel>.ValidationError(errors);
return Ok(modelResponse);
}
var user = GetUserProfile();
if (!await _permissionAdapter.HasPermission(user.UserId, Module.TransactionReversal, Permission.CanPerformReversal))
return StatusCode(403, new { Message = "You are not authorized to perform this operation" });
var response = await _service.Create(model, user.UserName);
return Ok(response);
}
catch (Exception)
{
return BadRequest(ErrorMessages.Generic_Error);
}
}
支票在这条线上
if (!await _permissionAdapter.HasPermission(user.UserId, Module.TransactionReversal, Permission.CanPerformReversal))
我怎样才能做到这一点?过滤器AuthorizeAttribute
要求必须在Startup.cs
文件中注册每个策略。
需要注意的另一件事是,权限是通过声明进入的,因为它们是在登录操作期间添加的,并且我希望在完成检查后始终转到数据库以始终获取用户的更新权限。这样做的原因是,当用户仍然通过 Web 客户端登录并且他正在尝试访问端点时,用户的权限可能会更新,如果声明尚未更新,它仍然会为该访问返回错误,直到人在更新声明之前再次登录。
解决方案
推荐阅读
- python - 触发多个 sql 查询时的异常处理
- windows - powershell中缺少括号错误
- c++ - C/C++ - 查询依赖于平台的换行符(用于内存映射文件)
- javascript - 如何按 itemId 和数量与类型 bundle 和 parentId 与类型 sale_order javascript 进行分组?
- c# - BinaryWriter 给出了错误的大小
- typescript - 从具有所有类型信息的另一个模块中导出类型
- node.js - 如何使用 SendGrid 编写用于发送电子邮件的云函数
- java - Ssl 证书导入需要在 Tomcat 或 JDK 中完成
- javascript - 如何使用 Javascript 从现有音频元素中获取 Blob 数据
- typescript - 我想在 angular 对象中添加一个新方法,但我使用@types/angular,如何扩展 angular.d.ts?