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

ASP.NET Core 7 Web API验证Token通过但控制器仍返回401状态

问题:Azure Entra ID OAuth认证后Token验证通过但API返回401

我有一个项目,前端是Chrome扩展,后端是ASP.NET Core 7 Web API,采用Azure Entra ID实现OAuth认证。Chrome扩展可成功获取Bearer Token并传递给API,日志显示Token已完成全部验证步骤,但控制器所有响应均返回401未授权状态。


相关代码

Program.cs 认证/授权配置

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
app.UseHttpsRedirection();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();

测试控制器代码

[Authorize]
[ApiController]
[Route("controller")]
public class WeatherForecastController : ControllerBase
{
    public WeatherForecastController()
    {
    }

    [HttpGet]
    public ActionResult<string> Test()
    {
        return "Hello";
    }
}

日志输出(已移除Token内容)

info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter[0]
Microsoft.IdentityModel Version: 6.32.3.0. Date 10/06/2023 10:56:55. PII logging is ON, do not use in production. See https://aka.ms/IdentityModel/PII for details.
IDX10242: Security token: '{}' has a valid signature.
info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter[0]
IDX10239: Lifetime of the token is valid.
info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter[0]
IDX10234: Audience Validated.Audience: ''
info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter[0]
IDX10245: Creating claims identity from the validated token: '{}'.
info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter[0]
IDX10241: Security token validated. token: '{}'.

可能的原因及解决方法

1. 受众(Audience)配置不匹配

日志显示Audience Validated.Audience: '',说明Token的受众为空,或与API配置的Audience不匹配。

  • 检查appsettings.json的AzureAd配置节,确保Audience值为API在Azure Entra ID中的应用ID URI或ClientId:
    "AzureAd": {
        "Instance": "https://login.microsoftonline.com/",
        "TenantId": "你的租户ID",
        "ClientId": "API的应用ID",
        "Audience": "API的应用ID URI" // 或直接使用ClientId
    }
    

2. CORS配置缺失或不完整

虽然调用了app.UseCors(),但未明确配置允许Chrome扩展的来源、请求头部(包括Authorization),可能导致请求被浏览器拦截,或Token传递异常。

  • 在Program.cs中添加明确的CORS策略:
    builder.Services.AddCors(options =>
    {
        options.AddPolicy("AllowChromeExtension",
            policy =>
            {
                policy.WithOrigins("chrome-extension://你的扩展ID")
                      .AllowAnyHeader()
                      .AllowAnyMethod();
            });
    });
    
    // 替换原有的app.UseCors()
    app.UseCors("AllowChromeExtension");
    

3. 授权策略与Token声明不匹配

[Authorize]默认要求用户具备对应权限/角色,如果Token中没有包含API所需的声明,即使Token验证通过,授权环节也会失败。

  • 暂时修改控制器的[Authorize]属性,明确指定认证方案:
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    
  • 检查Azure Entra ID中API的应用角色配置,确保Chrome扩展获取Token时请求了正确的范围或角色。

4. 启用详细授权日志排查

通过日志定位授权失败的具体原因:

  • 在appsettings.json中添加日志配置:
    "Logging": {
        "LogLevel": {
            "Microsoft.AspNetCore.Authorization": "Debug"
        }
    }
    
  • 添加未授权的测试接口,查看用户Claims:
    [HttpGet("claims")]
    public IActionResult GetClaims()
    {
        return Ok(User.Claims.Select(c => new { c.Type, c.Value }));
    }
    

内容的提问来源于stack exchange,提问作者Excellent Horse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:10:30