我已经设置了一个网络核心API服务器。我通过blazor客户应用发送请求。我将每个令牌的到期时间设置为2分钟,但是令牌可工作约7分钟。api是否会在每个请求中检查到期日期?
我正在使用的代码如下。在startup.cs中
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["JwtIssuer"],
ValidAudience = Configuration["JwtAudience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSecurityKey"]))
};
});
在用户登录时,像这样发出令牌
var expiry = DateTime.UtcNow.AddMinutes(2);
var token = new JwtSecurityToken(
_configuration["JwtIssuer"], // read from appsetttings.json
_configuration["JwtAudience"], // read from appsettings.json
claims, // claims added here
expires: expiry,
signingCredentials: creds // signature
);
我有两个请求:第一个是在11:52,这是有效的,而到期日期是11:49(您可以在下图中看到它)
第二个是在11:54,这是不成功的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的信息,您的API配置看起来是正确的,因为它确实启用了对JWT令牌有效期限(Lifetime)的验证。ValidateLifetime = true
这一行确保了在每次请求中,JWT中间件都会检查令牌是否过期。
如果您的客户端在令牌实际上已经过期后仍然能够成功发送请求长达7分钟,这可能不是由API服务器端的配置直接引起的。有几个可能的原因需要考虑:
时钟偏移:确保API服务器和客户端(或颁发JWT的服务器)的系统时间是同步的。有时区差异或系统时钟不准确可能导致过期时间判断不一致。
令牌缓存:检查客户端是否有任何机制错误地缓存了JWT令牌,并在过期后继续使用旧令牌。Blazor应用中可能会有处理身份验证逻辑的地方无意中复用了令牌。
中间件或代理服务器:如果您的架构中包含负载均衡器、反向代理(如Nginx、HAProxy)或其他网络中间件,这些组件有时会缓存响应,特别是当配置不当的时候。确认这些组件没有以某种方式缓存JWT验证的结果或整个响应。
JWT刷新机制:虽然您没提到,但有时候应用程序设计中会包含自动刷新令牌的机制。检查是否有代码逻辑在尝试刷新令牌并在后台透明地使用新令牌重新尝试请求。
调试和日志:为了更深入地了解问题,查看API服务器的日志记录,特别是与身份验证相关的部分。这可以帮助确认服务器端实际接收到的令牌及其验证结果,以及是否真的忽略了过期时间。
建议您首先从时间同步和客户端缓存方面进行排查,同时仔细审查API日志以获取更多线索。如果问题依然存在,考虑是否有其他网络组件可能影响到了请求处理流程。