如何根据用户角色检查用户是否被授权访问页面

时间:2019-06-07 11:56:59

标签: reactjs asp.net-core

我有一个Web应用程序,其中前端为reactjs,后端为asp.net core,我想允许基于用户角色访问页面。

我已经在react中实现了授权,但是出于安全目的,需要在服务器端执行授权。

我已经尝试过[Authorize(Roles = "Administrator")],但是由于我将控制器(对于所有用户来说都是常见的)复用为不同的角色,所以这是行不通的,并且由于我正在使用react,所以我也没有返回视图,所以我需要在asp.net core(基于角色)上实现授权部分的方法方面的帮助

2 个答案:

答案 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);
    }