我使用Asp.net Core 2.1中的IdentityServer4托管授权服务器。
我的客户的grant_type是ResourceOwnerPassword
,因此我实现了IResourceOwnerPasswordValidator
。当用户A使用正确的用户名和密码登录并获得一个access_token(名为token1)时,它工作正常,几分钟后,他再次使用相同的用户名和密码登录并获得了一个新的access_token(名为token2),如何使token1无效?用户获得了token2。
答案 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上对其进行验证。