在.NET Core微服务架构中实现安全认证是个常见但容易踩坑的话题。最近在部署一个基于ASP.NET Core的微服务系统时,踩了几个典型的坑,分享给大家。
问题背景
我们的微服务系统使用IdentityServer4作为认证中心,服务间通过JWT Token进行身份验证。最初配置时,所有服务都直接引用了IdentityServer的客户端配置,结果在生产环境中出现了Token过期后无法自动刷新的问题。
踩坑记录
坑1:Token刷新机制缺失 最初只配置了Bearer认证,没有实现自动刷新逻辑。当Access Token过期时,前端需要手动重新登录,用户体验极差。解决方案是在客户端添加了自定义的DelegatingHandler来处理401状态码,并尝试使用Refresh Token刷新。
public class RefreshTokenHandler : DelegatingHandler
{
private readonly IHttpClientFactory _httpClientFactory;
public RefreshTokenHandler(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
// 尝试刷新Token
var refreshToken = await GetRefreshToken();
var newToken = await RefreshAccessToken(refreshToken);
// 重新发送请求
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", newToken);
response = await base.SendAsync(request, cancellationToken);
}
return response;
}
}
坑2:跨服务认证配置混乱 多个微服务都配置了相同的认证中间件,但每个服务的配置参数不一致,导致Token验证失败。最终统一使用了共享的认证配置文件,并通过环境变量注入。
坑3:证书管理不当 开发环境使用自签名证书,生产环境切换到正式证书时出现验证失败。建议将证书配置为可热更新的格式,或使用Azure Key Vault等云服务管理。
最佳实践
- 统一认证服务,避免重复配置
- 实现Token自动刷新机制
- 做好证书生命周期管理
- 添加详细的认证日志便于排查问题

讨论