如何撤消引用令牌以阻止用户?

时间:2019-03-12 15:19:07

标签: c# identityserver4

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

经过长期研究,我确定IDS不支持诸如过期的访问令牌之类的东西,因为这不是OpenID Connect的一部分。令我感到奇怪的是,我切换了客户端以使用引用令牌,这些令牌已正确存储在PersistedGrants表中,但是即使清除该表也不会使以后的请求无效,因为用户仍然通过客户端应用程序和到Identity Server本身。

我可以重新实现任何商店/服务来阻止来自给定登录用户的所有访问吗?

1 个答案:

答案 0 :(得分:0)

最后,问题是由于另一个API不起作用,有人将AccessTokenType从1更改回0,因为它被配置为使用访问令牌而不是参考令牌。感谢@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();
}