SO *_*ood 7 c# identityserver4
我有一个 Identity Server 4 的实现,它使用 Entity Framework Core 进行持久存储,使用 ASP.NET Core Identity 进行用户管理。由于此 IDS 将支持公共应用程序,因此我们被要求添加一种完全阻止用户的方法 - 这意味着不允许他们登录并删除其现有登录名。
经过长时间的研究,我确定 IDS 不支持诸如过期访问令牌之类的任何事情,因为这不是 OpenID Connect 的一部分。让我感到完全奇怪的是,我将客户端切换为使用正确存储在 PersistedGrants 表中的引用令牌,但即使清除该表也不会使将来的请求无效,因为用户仍然通过客户端应用程序和到身份服务器本身。
是否有任何商店/服务我可以重新实施以阻止给定登录用户的所有访问?
最后,问题是有人将 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)
| 归档时间: |
|
| 查看次数: |
1441 次 |
| 最近记录: |