Разная функциональность API для разных ролей
У меня есть API с ядром asp.net 2.1. Проверка подлинности на основе утверждений. Можно ли объединить эти две функции API в одном?
[Authorize(Roles = "Admin")]
[HttpPost("delete")]
public IActionResult Delete([FromBody]Item item)
{
_itemService.Delete(item.Id);
return Ok();
}
[Authorize]
[HttpPost("delete")]
public IActionResult Delete([FromBody]Item item)
{
var id = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);
if (_itemService.IsAuthor(id))
{
_itemService.Delete(item.Id);
return Ok();
}
return Forbid();
}
Или я должен просто проверить роль внутри метода?
1 ответ
Решение
Для проверки разрешения с тем, является ли пользователь Admin
или же Author
Вы могли бы реализовать multiple requirements
как документ от @user2884707bond.
Для использования multiple requrements
для вашего сценария.
Вы можете выполнить следующие шаги:
PermissionHandler.cs
public class PermissionHandler : IAuthorizationHandler { public Task HandleAsync(AuthorizationHandlerContext context) { var pendingRequirements = context.PendingRequirements.ToList(); foreach (var requirement in pendingRequirements) { if (requirement is ReadPermission) { if (IsOwner(context.User, context.Resource) || IsAdmin(context.User, context.Resource)) { context.Succeed(requirement); } } else if (requirement is EditPermission || requirement is DeletePermission) { if (IsOwner(context.User, context.Resource)) { context.Succeed(requirement); } } } return Task.CompletedTask; } private bool IsAdmin(ClaimsPrincipal user, object resource) { if (user.IsInRole("Admin")) { return true; } return false; } private bool IsOwner(ClaimsPrincipal user, object resource) { // Code omitted for brevity return true; } private bool IsSponsor(ClaimsPrincipal user, object resource) { // Code omitted for brevity return true; } }
Требования
public class ReadPermission : IAuthorizationRequirement { // Code omitted for brevity } public class EditPermission : IAuthorizationRequirement { // Code omitted for brevity } public class DeletePermission : IAuthorizationRequirement { // Code omitted for brevity }
регистр
Requirement
вStartup.cs
services.AddAuthorization(options => { options.AddPolicy("Read", policy => policy.AddRequirements(new ReadPermission())); }); services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
использование
[Authorize(Policy = "Read")] [HttpPost("delete")] public IActionResult Delete([FromBody]Item item) { _itemService.Delete(item.Id); return Ok(); }