.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
相关产品推荐
相关产品推荐

