У меня есть основной API .net, который при аутентификации генерирует токен JWT, который следует использовать для вызова контроллеров с атрибутом авторизации. Хотя после создания токена контроллер каждый раз отвечает 401.
Я искал учебники только по основам, и мой код почти идентичен большинству руководств.
Конечная точка контроллера, для которой требуется токен;
// GET: api/Tournaments
[Authorize]
[HttpGet]
public IActionResult GetTournaments()
{
return Ok(_context.Tournaments.Select(t => _mapper.Map<TournamentDto>(t)));
}
Аутентифицировать конечную точку;
[HttpPost]
[Route("login")]
public async Task<IActionResult> Login([FromBody] LoginModelDto model)
{
var user = await _authService.Login(model);
if (user == null)
return BadRequest();
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim("UserID", user.UserId.ToString())
}),
Expires = DateTime.UtcNow.AddDays(1),
SigningCredentials =
new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSettings.JWT_Secret)),
SecurityAlgorithms.HmacSha256Signature)
};
var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(securityToken);
return Ok(new {token});
}
Startup.cs
var key = Encoding.UTF8.GetBytes(Configuration["ApplicationSettings:JWT_Secret"]);
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = false;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
Контроллер должен вернуть список турниров, но теперь возвращает 401. Я что-то пропустил? Моя интуиция подсказывает мне, что что-то не так с созданием токена JWT, хотя у меня нет идей для тестирования.
С наилучшими пожеланиями, Фредрик





я перевел порядок
app.UseHttpsRedirection();
app.UseMvc();
app.UseAuthentication();
к
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseMvc();
и теперь все работает как задумано.
Дело закрыто. Спасибо за ответ, Зак.