Есть ли способ сохранить роль пользователя в токене из этого кода? - PullRequest
0 голосов
/ 17 апреля 2020
 public class AuthController : ControllerBase
{

    private readonly AuthOptions _authOptions;
    private readonly SignInManager<User> _signInManager;
    private readonly UserManager<User> _userManager;
    private readonly IMapper _mapper;

    public AuthController(IOptions<AuthOptions> authOption, SignInManager<User> signInManager, UserManager<User> userManager,  IMapper mapper)
    {
        _authOptions = authOption.Value;
        _signInManager = signInManager;
        _userManager = userManager;
        _mapper = mapper;
    }

    [AllowAnonymous]
    [HttpPost("login")]
    public async Task<IActionResult> Login([FromBody]UserForLoginDto userLoginDto)
    {
        var checkPassword = await _signInManager.PasswordSignInAsync(userLoginDto.Username, userLoginDto.Password,false,false);

        if (checkPassword.Succeeded)
        {
            var signinCredentials = new SigningCredentials(_authOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256);
            var jwtSecurityToken = new JwtSecurityToken(
                 issuer: _authOptions.Issuer,
                 audience: _authOptions.Audience,
                 claims: new List<Claim>(),
                 expires: DateTime.Now.AddDays(30),
                 signingCredentials: signinCredentials);


            var tokenHandler = new JwtSecurityTokenHandler();

            var encodedToken = tokenHandler.WriteToken(jwtSecurityToken);
            return Ok(new { AccessToken = encodedToken });
        }

        return Unauthorized();
    }


}

Как я могу найти роль человека и включить ее в токен, чтобы я мог использовать ее для авторизации ролей? Идеи, решения? Контроллеры, украшенные [Authorize (Role = "Administrator")], возвращают 403, поэтому я не узнаю или не могу получить к ним доступ *

1 Ответ

0 голосов
/ 17 апреля 2020

Измените свой метод генерации токенов, например,

var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("your secret key");

var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, "your_user_id"),
                new Claim(ClaimTypes.Role, "your_role_name") //in your case here value "Administrator"
            }),
            Expires = DateTime.UtcNow.AddDays(30),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), 
                                              SecurityAlgorithms.HmacSha256Signature)
        };
var token = tokenHandler.CreateToken(tokenDescriptor);
var encodedToken = tokenHandler.WriteToken(token);

Затем вы можете использовать тег Authorize с ролью.

[Authorize (Role = "Administrator")]
...