用户密码更改时,IdentityServer会话和访问令牌无效

时间:2019-05-29 16:54:25

标签: authentication asp.net-core oauth-2.0 identityserver4

我正在ASP.NET Core 2.2中使用IdentityServer4。客户端应用程序(RP)是API,也是ASP.NET Core 2.2应用程序。用户使用授权码流登录并从IdentityServer(idsrv)获取cookie。然后,他们获得授权码并访问API(RP)的令牌。

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

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

这使我可以在身份验证票证过期之前使服务器上用户的IdentityServer会话无效。例如,当用户登录时,我添加了一个声明,该声明存储了他们的密码最后一次更改的日期;在MyCookieAuthenticationEvents.ValidatePrincipal()中,我按照https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.2#react-to-back-end-changes

我想对他们使用访问RP的访问令牌执行相同的操作。如果用户的密码已更改(在某些情况下),我希望访问令牌立即失效,而不是等待其过期。我正在使用参考标记,并已实现IProfileServiceICustomTokenValidator。在IProfileService.GetProfileDataAsync中,将密码更改日期声明复制到访问令牌声明集合中,在ICustomTokenValidator.ValidateAccessTokenAsync中,我再次针对真实用户检查该声明。

这可行,但似乎相当复杂且复杂,我想知道是否有更简单的方法来完成此操作-看来这应该是常见的要求。

1 个答案:

答案 0 :(得分:0)

如果您使用的是参考令牌,则要使该令牌失效,所需要做的就是将其从您拥有的IPersistedGrantStore的任何实现中删除,并在下次尝试通过自省进行验证时,将其删除将无效,因为它将不再存在。