我在Azure中有一个Thinktecture的Identity Server v3实例,作为WebApp托管。一般情况下,它按预期工作但我尝试通过令牌身份/连接/令牌端点使用刷新令牌与 refresh_token 授权类型有一些问题。我有一个使用授权代码流的客户端,这是与此客户端的刷新令牌选项相关的设置:
// refresh token options
AccessTokenType = AccessTokenType.Jwt,
AccessTokenLifetime = 3600,
RefreshTokenUsage = TokenUsage.OneTimeOnly, // Every time generates new refresh token. Not only access token.
RefreshTokenExpiration = TokenExpiration.Sliding,
SlidingRefreshTokenLifetime = 1296000
对于使用过此功能的人来说很明显我使用JWT令牌,我的访问令牌有效期为1小时,之后,无需再次登录Identity Server,我可以使用刷新令牌获取新访问权限并刷新令牌。我的刷新令牌必须有效15天(1296000秒)。实际发生的是它不能按预期工作。出于某种原因,当我决定拨打我的REST API(身份服务器的依赖方)之前一个半小时后,我得到 invalid_grant 响应。
我决定稍微测试一下,让我的访问令牌在2分钟后到期,我的刷新令牌在10中。好吧,然后我尝试拨打访问令牌后1,2,3 ...分钟已过期,它按预期工作。我真的不想用1小时的访问令牌进行这种测试,这就是为什么我决定在这里询问是否有人曾经过这个问题。
答案 0 :(得分:0)
访问令牌生命周期为1小时,刷新令牌生命周期为15天。
您在调用API时使用的令牌是访问令牌。如果您在最后一次刷新访问令牌后90分钟拨打电话,那么我似乎很正常。在这种情况下,在调用API之前,您应该检查访问令牌是否仍然有效,如果不是,则刷新它。
至于你的测试,在{(3}}类下面负责验证令牌。默认情况下,验证参数允许JwtSecurityTokenHandler
满足系统之间的时间变化。将TokenValidationParameters.DefaultClockSkew
修改为较小的值应该对您的情况有所帮助。