我有一个.net核心api,它在进行身份验证时会生成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令牌的创建还是有问题。
最好的问候, 弗雷德里克
答案 0 :(得分:0)
我移动了
的顺序app.UseHttpsRedirection();
app.UseMvc();
app.UseAuthentication();
到
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseMvc();
现在一切正常。
案例已关闭。谢谢您对扎克的回答。