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

.NET 8 Identity Api Endpoints跨服务验证令牌失败问题

解决.NET 8认证服务令牌跨服务验证无效问题

核心问题分析

你当前依赖AddIdentityApiEndpoints<User>的默认配置时,认证服务会自动生成临时对称密钥,该密钥仅在服务启动周期内有效,重启服务后会自动变更;同时客户服务未与认证服务使用一致的密钥及JWT配置,导致令牌验证失败。

解决方案步骤

1. 认证服务端显式配置JWT选项

修改认证服务的Program.cs,固定JWT签名密钥、签发方、受众等核心参数,确保配置可被其他服务复用:

builder.Services.AddDbContext<ApplicationDbContext>(opt =>
{
    opt.UseSqlServer(builder.Configuration.GetConnectionString("AuthDevDb"),
        b => b.MigrationsAssembly("Auth.Api"));
});

// 从配置文件读取JWT参数(生产环境建议用环境变量或密钥管理服务)
var jwtSettings = builder.Configuration.GetSection("JwtSettings");
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["SecretKey"]!));

builder.Services.AddIdentityApiEndpoints<User>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    // 覆盖默认令牌生成配置
    .AddApiEndpointsOptions(options =>
    {
        options.TokenEndpointConfig = config =>
        {
            config.SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
            config.Issuer = jwtSettings["Issuer"]; // 示例:"https://your-auth-service.com"
            config.Audience = jwtSettings["Audience"]; // 示例:"customer-service-api"
            config.Expiration = TimeSpan.FromHours(1); // 自定义令牌有效期
        };
    });

app.MapIdentityApi<User>();

在认证服务的appsettings.json中添加JWT配置节点:

{
  "JwtSettings": {
    "SecretKey": "your-strong-32-character-or-longer-secret-key-here",
    "Issuer": "https://your-auth-service-url",
    "Audience": "customer-service-api"
  }
}

2. 客户服务端配置JWT验证

在客户服务的Program.cs中添加JWT验证中间件,确保与认证服务的配置完全匹配:

var jwtSettings = builder.Configuration.GetSection("JwtSettings");
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["SecretKey"]!));

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = jwtSettings["Issuer"],
            ValidateAudience = true,
            ValidAudience = jwtSettings["Audience"],
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = signingKey,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero // 关闭时钟偏移容忍,严格验证令牌有效期
        };
    });

// 启用授权中间件
builder.Services.AddAuthorization();

// 在请求管道中添加认证、授权节点
app.UseAuthentication();
app.UseAuthorization();

同样在客户服务的appsettings.json中添加完全一致的JwtSettings配置。

额外注意事项

  • 生产环境禁止硬编码密钥,建议使用Azure Key Vault、AWS Secrets Manager等专业密钥管理工具,或通过环境变量传递密钥。
  • 确保认证服务与客户服务的系统时间同步,避免因时间差导致令牌有效期验证失败。
  • 若为分布式多服务场景,优先使用非对称密钥(RSA):认证服务用私钥签名令牌,客户服务用公钥验证,安全性更高。

内容的提问来源于stack exchange,提问作者Cihan Elibol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:34:59