Как создать разрешение на основе модуля в ASP.NET Сердечник

#c# #asp.net-core #asp.net-web-api

Вопрос:

Я рассмотрел авторизацию на основе политики и не вижу, чтобы она соответствовала моим потребностям.

У меня есть ASP.NET Основное приложение веб-API, управляющее клиентами (мобильными и веб -), которое имеет различные разделы, называемые модулем в этой форме

  1. Управление пользователями (CanView, canUpdate,CanAdd, CanExport)
  2. Транзакции (CanView, canUpdate,CanAdd, CanExport,CanProcessReversal) и т.д.

Каждая конечная точка в веб-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 файле.

Еще одна вещь, которую следует отметить, заключается в том, что разрешение поступает через утверждения, поскольку они были добавлены во время действия входа в систему, и я хочу всегда заходить в базу данных, когда будет выполнена проверка, чтобы всегда получать обновленное разрешение для пользователя. Причина этого заключается в том, что разрешение пользователя может быть обновлено, когда пользователь все еще входит в систему через веб-клиент и пытается получить доступ к конечной точке, если утверждения не были обновлены, оно все равно будет возвращать ошибку для этого доступа, пока пользователь снова не войдет в систему, прежде чем утверждение можно будет обновить.

Комментарии:

1. Вы можете проверить это:Авторизация на основе разрешений в ASP.NET Сердечник