首页 > 解决方案 > 如何在 ASP.NET Core 中创建基于模块的权限

问题描述

我已经查看了基于策略的授权,但我认为它不适合我的需要。

我有一个 ASP.NET Core Web API 应用程序,它控制具有不同部分的客户端(移动和 Web),这些部分称为模块

  1. 用户管理(CanView、CanUpdate、CanAdd、CanExport)
  2. 事务(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 客户端登录并且他正在尝试访问端点时,用户的权限可能会更新,如果声明尚未更新,它仍然会为该访问返回错误,直到人在更新声明之前再次登录。

标签: c#asp.net-coreasp.net-web-api

解决方案


推荐阅读