如何撤销阻止用户的参考令牌?

SO *_*ood 7 c# identityserver4

我有一个 Identity Server 4 的实现,它使用 Entity Framework Core 进行持久存储,使用 ASP.NET Core Identity 进行用户管理。由于此 IDS 将支持公共应用程序,因此我们被要求添加一种完全阻止用户的方法 - 这意味着不允许他们登录并删除其现有登录名。

经过长时间的研究,我确定 IDS 不支持诸如过期访问令牌之类的任何事情,因为这不是 OpenID Connect 的一部分。让我感到完全奇怪的是,我将客户端切换为使用正确存储在 PersistedGrants 表中的引用令牌,但即使清除该表也不会使将来的请求无效,因为用户仍然通过客户端应用程序和到身份服务器本身。

是否有任何商店/服务我可以重新实施以阻止给定登录用户的所有访问?

SO *_*ood 1

最后,问题是有人将 AccessTokenType 从 1 更改回 0,因为另一个 API 不起作用,因为它被配置为使用访问令牌而不是引用令牌。感谢@VidmantasBlazevicius指出了查看端点调用日志的正确方向connect/introspect

作为参考,这是我们最终使用的代码(由管理员用户调用,适当保护):

[HttpPut("{userId}/Block")]
public async Task<IActionResult> BlockUser(string userId)
{
    var user = await _context.Users.FindAsync(userId);

    if (user == null || !user.LockoutEnabled || user.LockoutEndDate > DateTime.Now)
    {
        return BadRequest();
    }

    var currentTokens = await _context.PersistedGrants
        .Where(x => x.SubjectId == user.UserId)
        .ToArrayAsync();

    _context.PersistedGrants.RemoveRange(currentTokens);

    var newLockOutEndDate = DateTime.Now + TimeSpan.FromMinutes(_options.LockOutInMinutes);
    user.LockoutEndDate = newLockOutEndDate;

    string updater = User.Identity.Name;
    user.UpdateTime(updater);

    await _context.SaveChangesAsync();

    return NoContent();
}
Run Code Online (Sandbox Code Playgroud)