首页 > 解决方案 > 如何从特定会话 Identity Server 4、.Net Core 中注销用户?

问题描述

Identity Serve 4.Net Core 3.1一起使用,剃须刀页面。还使用 Cookie 身份验证

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)

问题 -

在一个 Web 应用程序中,John 登录了 2 次

因此,如果约翰再次尝试在 Firefox 上第三次登录而没有从以前的浏览器中注销,那么我想强制让约翰从 Chrome 上的第一次登录中注销。

我可以在会话表中跟踪登录,包括会话 ID、用户 ID 等。但我不知道如何使用会话 ID 从特定会话中注销用户。

请帮忙。

谢谢

标签: c#.netasp.net-coreasp.net-identityidentityserver4

解决方案


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);

推荐阅读