Если вы действительно хотите использовать одно действие для каждого варианта использования для всех ролей, вы можете рассмотреть возможность использования ControllerBase.HttpContext:
[HttpGet("[action]")]
[Authorize(Roles = "Administrator,User")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> GetSomething()
{
var userRoles = this.HttpContext.User.Claims.Where(claim => claim.Type == System.Security.Claims.ClaimTypes.Role).Select(claim => claim.Value).ToList();
if (!userRoles.Any())
return Unauthorized();
return await GetSomethingDependingOnGivenRoles(userRoles);
}
Вы также можете использовать расширение для этого:
public static class ControllerBaseExtensions
{
public static List<string> GetRoles(this ControllerBase controller)
{
return controller.HttpContext.User.Claims.Where(claim => claim.Type == System.Security.Claims.ClaimTypes.Role).Select(claim => claim.Value).ToList();
}
}
так что вы можете использовать его так:
[HttpGet("[action]")]
[Authorize(Roles = "Administrator,User")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> GetSomething()
{
var userRoles = this.GetRoles();
if (!userRoles.Any())
return Unauthorized();
return await GetSomethingDependingOnGivenRoles(userRoles);
}