#c# #asp.net-core #asp.net-web-api
Вопрос:
Я рассмотрел авторизацию на основе политики и не вижу, чтобы она соответствовала моим потребностям.
У меня есть ASP.NET Основное приложение веб-API, управляющее клиентами (мобильными и веб -), которое имеет различные разделы, называемые модулем в этой форме
- Управление пользователями (CanView, canUpdate,CanAdd, CanExport)
- Транзакции (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 Сердечник