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

已登录用户调用带[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:15:00