已登录用户调用带[Authorize]特性的ASP.NET Core Web API返回401未授权错误
问题排查与解决方案
核心问题:中间件执行顺序错误
你当前Configure方法中的中间件顺序不符合ASP.NET Core + IdentityServer的执行要求,错误的顺序会导致身份认证逻辑在路由匹配前执行,无法正确识别请求的认证信息:
现有错误顺序
app.UseAuthentication(); app.UseRouting(); app.UseIdentityServer(); app.UseAuthorization();
请修改为以下正确顺序:
app.UseHttpsRedirection(); app.UseStaticFiles(); if (!env.IsDevelopment()) { app.UseSpaStaticFiles(); } // 先执行路由匹配 app.UseRouting(); // 再执行身份认证逻辑 app.UseAuthentication(); // 再执行IdentityServer相关校验 app.UseIdentityServer(); // 最后执行授权校验 app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller}/{action=Index}/{id?}"); endpoints.MapRazorPages(); });
其他排查项
- 显式指定API的认证方案
你项目中同时配置了Cookie认证(供页面登录使用)和JWT认证(供API使用),[Authorize]特性默认可能会优先使用Cookie认证方案,导致API请求携带的JWT令牌不被识别,你可以给需要授权的API接口显式指定JWT认证方案:
也可以全局配置默认认证方案,修改[HttpGet] [Authorize(AuthenticationSchemes = "IdentityServerJwt")] public object GetUsers() { var userService = new UserService(); return userService.GetUsers(); }ConfigureServices中的AddAuthentication代码:services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "IdentityServerJwt"; options.DefaultChallengeScheme = "IdentityServerJwt"; }) .AddIdentityServerJwt(); - 确认请求携带有效认证信息
浏览器端调用API时,可通过F12网络面板查看请求头是否存在Authorization字段,值格式为Bearer <访问令牌>,默认生成的Angular + ASP.NET Core IdentityServer模板会自带请求拦截器自动附加令牌,如果你做过自定义修改,需要确认拦截器逻辑正常。
Postman测试时不能直接依赖Cookie认证,需要先从IdentityServer获取有效access_token,再将令牌附加到请求头的Authorization字段中。 - 确认测试账号状态合规
你配置了options.SignIn.RequireConfirmedAccount = true,如果测试用的账号未完成邮箱确认,即使前端显示登录成功,身份认证也会被拒绝,可临时将该配置改为false测试,或给测试账号完成邮箱确认流程。
内容的提问来源于stack exchange,提问作者Ben C
相关产品推荐
相关产品推荐

