我使用KeyCloak登录时收到错误。
我得到的错误是“访问令牌和刷新令牌都已过期”
我按照这里详述的例子; https://github.com/dylanplecki/KeycloakOwinAuthentication/wiki/ASP.NET-MVC-Tutorial
代码适用于登录页面。我输入登录ID和密码,按“登录”按钮,立即在黄色屏幕上显示上述错误。
我已经在Master域中创建了客户端,并根据上面网页中的内容设置了所有设置。
有谁知道我需要做些什么来解决这个问题?
以下是解决此问题所需要做的事情,并正常使用Keycloak:由于它被报告为错误,而且图书馆作者/维护者不再使用它,您将不得不修复本地副本,并且使用它而不是NuGet包。
背景:Keycloak在需要时间参考的所有属性中使用UTC时间,例如Token的nbf
或exp
。由于Access令牌通常有效5分钟,因此除非机器恰好位于与UTC时间匹配的时区,否则您将永远无法达到5分钟的限制。该库的问题是它将令牌中的时间与DateTime.Now
进行比较,您需要将其手动更改为DateTime.UtcNow
实现:您可以从GitHub here下载库代码的副本,并浏览解决方案中的第一个项目:KeycloakIdentityModel
到任务所在的文件:KeycloakIdentity.cs
。转到第443行,这是比较任务GetClaimsAsync
的开始。
在任务中,有一个if语句,你将把所有DateTime.Now
改成DateTime.UtcNow
。结果应如下所示:
// Check to update cached claims, but not if refresh token is missing (as in bearer mode)
if ((_kcClaims == null || _accessToken.ValidTo <= DateTime.UtcNow) && _refreshToken != null)
{
// Validate refresh token expiration
if (_refreshToken.ValidTo <= DateTime.UtcNow)
throw new Exception("Both the access token and the refresh token have expired");
// Load new identity from token endpoint via refresh token
await RefreshIdentity(_refreshToken.RawData);
}
变化发生在第439和442行。
之后重建解决方案,并浏览解决方案的物理文件夹到〜\ src \ Owin.Security.Keycloak \ bin \ Debug,确保修改它们的日期类似于实际时间并复制两个文件KeycloakIdentityModel.dll
和Owin.Security.Keycloak.dll
到一个容易到达的目录(这不是必需的,但为简单起见而推荐)。
然后从解决方案中删除引用中的两个并通过右键单击解决方案资源管理器中的引用节点并选择添加引用来添加新引用。浏览到保存它们的位置,添加它们,它应该以这种方式正常运行。