我有一个Identity Server 4的实现,该实现使用Entity Framework Core进行持久存储,并使用ASP.NET Core Identity进行用户管理。由于此IDS将支持公共应用程序,因此我们被要求添加一种完全阻止用户的方法-这意味着不允许他们登录并删除其现有登录名。
经过长期研究,我确定IDS不支持诸如过期的访问令牌之类的东西,因为这不是OpenID Connect的一部分。令我感到奇怪的是,我切换了客户端以使用引用令牌,这些令牌已正确存储在PersistedGrants表中,但是即使清除该表也不会使以后的请求无效,因为用户仍然通过客户端应用程序和到Identity Server本身。
我可以重新实现任何商店/服务来阻止来自给定登录用户的所有访问吗?
答案 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();
}