как проверить, авторизован ли пользователь для доступа к странице в зависимости от его роли - PullRequest
0 голосов
/ 07 июня 2019

У меня есть веб-приложение, в котором внешний интерфейс равен reactjs, а внутренний - asp.net core. Я хочу разрешить доступ к странице на основе ролей пользователя.

Я реализовал авторизацию в реакции, нов целях безопасности необходимо выполнить авторизацию на стороне сервера.

Я пробовал [Authorize(Roles = "Administrator")], но это не сработает, поскольку я повторно использую контроллер (общий для всех пользователей) для другой роли, а также не возвращаюсьпредставление, так как я работаю с реагировать, поэтому мне нужна помощь в реализации части авторизации на asp.net core (на основе ролей)

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Если вы действительно хотите использовать одно действие для каждого варианта использования для всех ролей, вы можете рассмотреть возможность использования 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);
    }
0 голосов
/ 07 июня 2019

Раз подход должен иметь разные действия для каждой роли

[Authorize(Roles = "Administrator")]
public IActionResult Action() {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...