c# - 如何从特定会话 Identity Server 4、.Net Core 中注销用户?
问题描述
将Identity Serve 4与.Net Core 3.1一起使用,剃须刀页面。还使用 Cookie 身份验证
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
问题 -
在一个 Web 应用程序中,John 登录了 2 次
- 第一次登录 Chrome
- 第二次登录边缘
因此,如果约翰再次尝试在 Firefox 上第三次登录而没有从以前的浏览器中注销,那么我想强制让约翰从 Chrome 上的第一次登录中注销。
我可以在会话表中跟踪登录,包括会话 ID、用户 ID 等。但我不知道如何使用会话 ID 从特定会话中注销用户。
请帮忙。
谢谢
解决方案
ASP.NET Core 提供了一个ITicketStore接口,允许您控制存储用户会话。一旦你提供了一个实现这个接口的类并注册了它,它就会在创建或验证会话时调用你的类,然后你可以随意存储在数据库中,包括附加任意元数据,如浏览器 ID 等。
现在您的数据库中有用户会话,您可以单独查询它们并根据需要在其他逻辑中撤销,包括在登录期间。由于您现在提供会话数据,因此只需删除记录即可有效地将用户从该会话中注销。请注意,如果您使用任何缓存层来减少存储请求,则还需要删除所有缓存的副本。
请注意,这与 IdentityServer 是分开的,并且发生在 ASP.NET Core 本身。
这是一个很好的教程,帮助我在我的应用程序中实现了这一点。
在 Startup 中注册的示例,PersistentTicketStore
我的实现在哪里:
// Persistent ticket/cookie store to provide durable user sessions
services.AddSingleton<IUserSessionRepository, UserSessionRepository>();
services.AddSingleton<ITicketStore, PersistentTicketStore>();
services.AddOptions<CookieAuthenticationOptions>(CookieAuthenticationDefaults.AuthenticationScheme)
.Configure<ITicketStore>((options, store) => options.SessionStore = store);
推荐阅读
- python - VS code Pygame 不加载 mp3 音乐
- javascript - document.getElementById 不工作(HTML JAVASCRIPT)
- pine-script - 替换 valuewhen 以遵循 PineCoders 的代码优化指南
- javascript - jQuery bg 备用
- gitlab-ci - 英特尔代码覆盖率:来自多个 CI 作业的组合代码覆盖率与单独构建的可执行文件
- ruby-on-rails - activeadmin 不允许的参数::subdomain
- javascript - 如何正确输出 json 作为对象
- flutter - 必须是未来的日期:“TZDateTime”的实例
- regex - 如何使用 grafana 对来自 elasticsearch 的唯一值进行分组
- c++ - 如何通过编译标志包含头文件?