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

