You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:22:35