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

.NET Core Web API认证成功但[Authorize]返回403授权失败排查

问题原因与解决方案

核心问题

你在创建ClaimsIdentity时没有指定认证类型,导致ClaimsIdentity.IsAuthenticated属性为false。默认的[Authorize]特性要求用户必须处于已认证状态,因此直接返回403授权失败。

修复方法

修改ValidateToken方法里创建ClaimsIdentity的代码,添加认证类型参数(推荐使用JwtBearerDefaults.AuthenticationScheme):

public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
    var payload = GoogleJsonWebSignature.ValidateAsync(securityToken, _validationSettings).Result;
    validatedToken = _jwtHandler.ReadJwtToken(securityToken);

    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.NameIdentifier, payload.Name),
        new Claim(ClaimTypes.Name, payload.Name),
        new Claim(JwtRegisteredClaimNames.FamilyName, payload.FamilyName),
        new Claim(JwtRegisteredClaimNames.GivenName, payload.GivenName),
        new Claim(JwtRegisteredClaimNames.Email, payload.Email),
        new Claim(JwtRegisteredClaimNames.Sub, payload.Subject),
        new Claim(JwtRegisteredClaimNames.Iss, payload.Issuer),
    };

    var principal = new ClaimsPrincipal();
    // 关键:添加认证类型,标记身份为已认证状态
    principal.AddIdentity(new ClaimsIdentity(claims, JwtBearerDefaults.AuthenticationScheme));
    return principal;
}

原理说明

  • 不带认证类型创建的ClaimsIdentity,IsAuthenticated默认值为false,即便你添加了所有用户声明,系统也不会将其识别为已认证用户。
  • 默认授权策略的逻辑是仅允许已认证用户访问,它会检查HttpContext.User.Identity.IsAuthenticated是否为true。
  • 指定认证类型后,IsAuthenticated会自动变为true,满足默认授权策略的访问要求。

额外验证

你的中间件顺序是正确的:UseAuthentication()在UseAuthorization()之前,这部分无需调整。


内容的提问来源于stack exchange,提问作者Thomas Kendall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:36:22