Я пытаюсь создать токен с логином для управления доступом. В настоящее время моя система генерирует ключ, я могу получить свой ключ, войдя в систему, затем я делаю запрос авторизованному контроллеру с ключом (с почтальоном). когда я это делаю, выдается ошибка недопустимого токена 401, и мой запрос на доступ не удается. Когда я проверяю ключ через JWT io, он содержит правильную информацию, а когда я применяю секрет, он отображается как проверенный.
Код: Выделить всё
namespace API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AuthenticationController : CustomBaseController
{
private readonly Jwt _jwtSettings;
private readonly IMapper _mapper;
private readonly IUserService _userService;
private readonly IRoleService _roleService;
public AuthenticationController(IOptions jwt, IMapper mapper, IUserService userService, IRoleService roleService)
{
_jwtSettings = jwt.Value;
_mapper = mapper;
_userService = userService;
_roleService = roleService;
}
[HttpPost("Login")]
public async Task Login([FromBody] UserLoginDto userLoginDto)
{
var userLogin = await _userService.GetUserForLoginAsync(userLoginDto.Username, userLoginDto.Password);
if (userLogin == null)
{
return Unauthorized("Kullanıcı bulunamadı! ");
}
var token = CreateToken(userLoginDto);
return Ok(token);
}
private string CreateToken(UserLoginDto userLoginDto)
{
if(_jwtSettings.Key == null) throw new Exception("Jwt ayarlarındaki key değeri boş olamaz");
var user = _userService.GetUserByUserNameAsync(userLoginDto.Username);
var roleName = _roleService.GetRoleNameByRoleId(user.Result.RoleId);
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.Key));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, userLoginDto.Username),
new Claim(ClaimTypes.Role, roleName)
};
var token = new JwtSecurityToken(_jwtSettings.Issuer, _jwtSettings.Audience,
claims,
expires: DateTime.Now.AddHours(1),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
}
Код: Выделить всё
public async Task GetUserByUserNameAsync(string username)
{
return await _context.Users.SingleOrDefaultAsync(x => x.Username == username);
}
Код: Выделить всё
public string GetRoleNameByRoleId(int roleId)
{
var role = _appDbContext.Roles.FirstOrDefault(r => r.RoleId == roleId);
return role?.RoleName;
}
Код: Выделить всё
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true,
ValidateLifetime = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"] ?? string.Empty))
};
});
builder.Services.Configure(builder.Configuration.GetSection("Jwt"));
Источник: https://stackoverflow.com/questions/781 ... o-i-fix-it
Мобильная версия