.NET 7 Swagger API集成JWT认证后,携带有效Token访问接口仍返回HTTP 401未授权错误
.NET 7 Swagger API集成JWT认证后,携带有效Token访问接口仍返回HTTP 401未授权错误
我仔细看了你的代码,发现几个关键问题导致了401未授权错误,咱们一步步来解决:
1. 认证与授权中间件顺序完全搞反了
在Program.cs的请求管道配置中,你把UseAuthorization()放在了UseAuthentication()前面,这是核心错误!
- **认证(Authentication)**的作用是验证用户的身份(确认Token是否有效、是否属于合法用户)
- **授权(Authorization)**的作用是判断已认证的用户是否有权限访问当前接口
所以必须先执行认证中间件,再执行授权中间件。修改后的代码应该是:
app.UseHttpsRedirection(); // 先认证,再授权,顺序不能错! app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();
2. 登录生成Token时用错了用户对象
在AuthController的Authenticate方法里,你通过UserManager正确获取了managedUser(这是IdentityUser实例,包含系统认证所需的用户信息),但生成Token时却误用了自定义的userInDb对象:
// 错误的写法:用了自定义User实体 var accessToken = _tokenService.CreateToken(userInDb); // 正确的写法:用UserManager获取的IdentityUser实例 var accessToken = _tokenService.CreateToken(managedUser);
你的TokenService.CreateToken方法参数是IdentityUser类型,传入自定义User对象会导致Claims生成异常或缺失关键信息,最终Token验证失败。
另外要确认你的自定义User类是否继承了IdentityUser?如果没有,那userInDb和managedUser是完全不同的对象,这会进一步加剧Token验证的问题。
3. 额外小问题(不影响认证但会导致接口报错)
在QuestionsController的GetQuestionsAsync方法里,你定义了question1、question2,但返回列表时引用了未定义的question3、question4,这会导致接口运行时抛出异常,建议修正:
// 修正后的示例代码 var question1 = new Question { Id = 1, IdSurvey = 1, Text = "¿Te gusta el deporte?" }; var question2 = new Question { Id = 2, IdSurvey = 1, Text = "¿Te gusta el fútbol?" }; var questions = new List<Question> { question1, question2 }; return Ok(questions);
把这几个问题修正后,重新生成Token再访问接口,应该就能正常通过认证了。
备注:内容来源于stack exchange,提问作者Diego Perez
相关产品推荐
相关产品推荐

