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

.NET 5迁移至.NET 8后JWT认证失败:HttpContext.User.IsAuthenticated为false

.NET 5迁移至.NET 8后JWT认证异常问题

我已将API从.NET 5迁移至.NET 8,目前遇到的问题是:即使在请求头中传递了JwtToken,HttpContext.User.IsAuthenticated仍为false。

Startup.cs中的JWT配置代码(.NET 5中运行正常)

services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtBearerOptions =>
{
    jwtBearerOptions.RequireHttpsMetadata = false;
    jwtBearerOptions.SaveToken = true;
    jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters
    {
        ClockSkew = new TimeSpan(0),
        ValidateIssuer = true,
        ValidateActor = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = jwtSettings.Issuer,
        ValidAudience = jwtSettings.Audience,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Key))
    };
    jwtBearerOptions.EventsType = typeof(JwtTokenValidatedEvent);
});

我通过EventsType自定义了JWT验证事件,用于修改Claim对象,相关截图如下:
JWT验证事件中修改Claim的代码截图
JWT验证事件执行逻辑截图

JWT Token生成代码

JwtSecurityTokenHandler tokenHandler = new();
byte[] key = Encoding.ASCII.GetBytes(_jwtSettings.Key);
List<Claim> claims = new()
{
    new Claim(System.Security.Claims.ClaimTypes.NameIdentifier, user.UserId.ToString()),
    new Claim("companyid", Convert.ToString(user.CompanyId)),
    new Claim("usertypeid", Convert.ToString(user.UserTypeId)),
    new Claim("companyfacilityid", Convert.ToString(user.CompanyFacilityId)),
    new Claim("timezone", preferedTimeZone)
};

claims.AddRange(roles.Select(r => new Claim(Library.Common.UserRoleClaim, r)).ToList());

SecurityTokenDescriptor tokenDescriptor = new()
{
    Audience = _jwtSettings.Audience,
    Issuer = _jwtSettings.Issuer,
    Subject = new ClaimsIdentity(claims),
    Expires = DateTime.UtcNow.AddMinutes(_jwtSettings.JWTTokenValidityMinutes),
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);

内容的提问来源于stack exchange,提问作者Dharmesh Solanki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:15:59