Authentication 当用户';用户的密码更改

Authentication 当用户';用户的密码更改,authentication,asp.net-core,oauth-2.0,identityserver4,Authentication,Asp.net Core,Oauth 2.0,Identityserver4,我正在ASP.NET Core 2.2中使用IdentityServer 4。客户端应用程序(RP)是一个API,也是一个ASP.NET核心2.2应用程序。用户使用授权代码流登录,并从IdentityServer(idsrv)获取cookie。然后获得API(RP)的授权码和访问令牌 我希望能够在某些情况下撤销用户的现有登录会话并访问令牌,例如,如果他们的密码已重置。在IdentityServer中,我已实现并添加了我自己的身份验证方案: .AddCookie("MyAu

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

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

            .AddCookie("MyAuthenticationScheme", options =>
            {
                options.SessionStore = new MyTicketStore();
                options.EventsType = typeof(MyCookieAuthenticationEvents);
            })
这允许我在身份验证票证过期之前,使服务器上用户的IdentityServer会话无效。例如,当用户登录时,我添加了一个声明,其中存储了上次更改密码的日期,并在
mycokieeauthenticationevents.ValidatePrincipal()
中检查该声明是否自上次更改后未更改,如上所示

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


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

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

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

谢谢,但这似乎并不比ICustomTokenValidator简单多少。我仍然需要访问声明(检查用户的密码是否在令牌发布后发生了更改),并且在ICustomTokenValidator中,它们已经为我进行了解析。这取决于您,但按照我的建议,您实际上可以“立即”使令牌无效。按照您的建议,在下一次请求令牌之前,引用令牌仍然完全有效。一般来说,操纵持久化授权存储可能比将业务逻辑放入
ICustomTokenValidator
中更好(但当然,我对这一说法持高度肯定态度)。没错,可以在请求之前将令牌从授权存储中移除,但是,有没有一个场景会产生实际的不同呢?@EM0在你的特定场景中-我想不出任何东西。您要求使用一种更简单的方法,这是一种更简单的方法,因为在更改密码时,您将有额外的调用来清除用户的现有授权(调用一次),而不是您现在正在进行的日期比较(每次调用)。我的方法为您提供了一种“立即使令牌失效”的方法,您的方法“如果用户的密码在x时间内发生了更改,则使令牌请求失效”。这是一个更通用的抽象,它涵盖了您实际要实现的总体目标。当然,你根本不需要实施它。哦,我现在明白你的意思了!不幸的是,我不能依赖IdentityServer代码总是收到要求会话失效的通知,它必须检查用户数据库以确保。因此,在我的例子中,实现
IPersistedGrantStore
似乎没有任何好处。谢谢你指出这一点!谢谢,但这似乎并不比ICustomTokenValidator简单多少。我仍然需要访问声明(检查用户的密码是否在令牌发布后发生了更改),并且在ICustomTokenValidator中,它们已经为我进行了解析。这取决于您,但按照我的建议,您实际上可以“立即”使令牌无效。按照您的建议,在下一次请求令牌之前,引用令牌仍然完全有效。一般来说,操纵持久化授权存储可能比将业务逻辑放入
ICustomTokenValidator
中更好(但当然,我对这一说法持高度肯定态度)。没错,可以在请求之前将令牌从授权存储中移除,但是,有没有一个场景会产生实际的不同呢?@EM0在你的特定场景中-我想不出任何东西。您要求使用一种更简单的方法,这是一种更简单的方法,因为在更改密码时,您将有额外的调用来清除用户的现有授权(调用一次),而不是您现在正在进行的日期比较(每次调用)。我的方法为您提供了一种“立即使令牌失效”的方法,您的方法“如果用户的密码在x时间内发生了更改,则使令牌请求失效”。这是一个更通用的抽象,它涵盖了您实际要实现的总体目标。当然,你根本不需要实施它。哦,我现在明白你的意思了!不幸的是,我不能依赖IdentityServer代码总是收到要求会话失效的通知,它必须检查用户数据库以确保。因此,在我的例子中,实现
IPersistedGrantStore
似乎没有任何好处。谢谢你指出这一点!