我有一个Web应用程序,其中前端为reactjs
,后端为asp.net core
,我想允许基于用户角色访问页面。
我已经在react中实现了授权,但是出于安全目的,需要在服务器端执行授权。
我已经尝试过[Authorize(Roles = "Administrator")]
,但是由于我将控制器(对于所有用户来说都是常见的)复用为不同的角色,所以这是行不通的,并且由于我正在使用react,所以我也没有返回视图,所以我需要在asp.net core
(基于角色)上实现授权部分的方法方面的帮助
答案 0 :(得分:0)
一旦方法是对每个角色采取不同的动作
[Authorize(Roles = "Administrator")]
public IActionResult Action() {}
答案 1 :(得分:0)
如果您真的想针对每个用例对所有角色使用一项操作,则可以考虑使用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);
}