当用户的密码更改时使身份服务器会话和访问令牌失效



我在 ASP.NET Core 2.2中使用IdentityServer4。客户端应用程序 (RP) 是一个 API,也是一个 ASP.NET 核心 2.2 应用程序。用户使用授权代码流登录并从身份服务器(idsrv)获取cookie。然后,他们获取 API (RP) 的授权代码和访问令牌。

我希望能够在某些情况下撤销用户的现有登录会话和访问令牌,例如,如果他们的密码已被重置。在IdentityServer中,我已经实现了添加自己的身份验证方案:

.AddCookie("MyAuthenticationScheme", options =>
{
options.SessionStore = new MyTicketStore();
options.EventsType = typeof(MyCookieAuthenticationEvents);
})

这允许我在身份验证票证过期之前使服务器上的用户身份服务器会话失效。例如,当用户登录时,我添加一个声明,该声明存储其上次更改密码的日期,并在MyCookieAuthenticationEvents.ValidatePrincipal()中检查它是否此后未更改,如 https://learn.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.2#react-to-back-end-changes

我想对他们使用 RP 访问的访问令牌做同样的事情。如果用户的密码已更改(在其他一些情况下),我希望访问令牌立即失效,而不是等待它过期。我正在使用参考令牌,并已实现IProfileServiceICustomTokenValidatorIProfileService.GetProfileDataAsync,我将密码更改日期声明复制到访问令牌声明集合,ICustomTokenValidator.ValidateAccessTokenAsync再次根据真实用户检查该声明。

这有效,但它似乎非常复杂和复杂,我想知道是否有更简单的方法来实现这一点 - 似乎这应该是一个常见的要求。

如果您使用的是引用令牌,则为了使令牌无效,您只需要将其从您拥有的任何IPersistedGrantStore实现中删除,下次尝试通过内省验证引用令牌时,它将无效,因为它将不再存在。

最新更新