我正在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的访问令牌执行相同的操作。如果用户的密码已更改(在某些情况下),我希望访问令牌立即失效,而不是等待其过期。我正在使用参考标记,并已实现IProfileService
和ICustomTokenValidator
。在IProfileService.GetProfileDataAsync
中,将密码更改日期声明复制到访问令牌声明集合中,在ICustomTokenValidator.ValidateAccessTokenAsync
中,我再次针对真实用户检查该声明。
这可行,但似乎相当复杂且复杂,我想知道是否有更简单的方法来完成此操作-看来这应该是常见的要求。
答案 0 :(得分:0)
如果您使用的是参考令牌,则要使该令牌失效,所需要做的就是将其从您拥有的IPersistedGrantStore
的任何实现中删除,并在下次尝试通过自省进行验证时,将其删除将无效,因为它将不再存在。