如何使用IdentityServer4中的ResourceOwnerPassword GrantType使旧令牌无效

时间:2018-08-09 15:43:57

标签: asp.net-core identityserver4

我使用Asp.net Core 2.1中的IdentityServer4托管授权服务器。

我的客户的grant_type是ResourceOwnerPassword,因此我实现了IResourceOwnerPasswordValidator。当用户A使用正确的用户名和密码登录并获得一个access_token(名为token1)时,它工作正常,几分钟后,他再次使用相同的用户名和密码登录并获得了一个新的access_token(名为token2),如何使token1无效?用户获得了token2。

2 个答案:

答案 0 :(得分:0)

如果选择jwt access_token,则无法撤消它。但对于参考令牌,可能会如下所示(未测试):

    public class CustomResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
    {
        private readonly IReferenceTokenStore _referenceTokenStore;
        public CustomResourceOwnerPasswordValidator(IReferenceTokenStore referenceTokenStore)
        {
            _referenceTokenStore= referenceTokenStore;
        }

        public Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
        {
            var subjectId = //get subjectId for user
            var clientId = // get from context
            _referenceTokenStore.RemoveReferenceTokensAsync(subjectId, clientId);// revoke all user token for session
            // other stuff
        }
    }

答案 1 :(得分:0)

在所采用的技术范围内,问题没有答案。设计上根本不可能。访问令牌不能无效。它为应用提供了对某些API的访问权限,并且具有一定的生存期。就这样。可以失效的是刷新令牌,但是您的RO授予中没有它。由于RO不是登录帐户,因此您不能注销用户

为了改善这种情况,请遵循OIDC规范并避免实施自己的协议,最好更改方法:

  • 切换到授权码或混合授权类型
  • 使用寿命短的访问令牌
  • 另外使用刷新令牌,该令牌可让您在需要时获得新的访问权限
  • 实施反向通道退出逻辑,以使刷新令牌无效

另一种替代方法是,通过设置client.AccessTokenType = AccessTokenType.Reference;来切换为IS docs中所述的引用令牌类型,然后按照in the doc所述使用Identityserver4.AccessTokenValidation包在您的API上对其进行验证。