我有一个 ASP.NET Web 窗体应用程序。该应用程序不会在内部使用,而是会安装在服务器上并出售给将在内部使用它的客户。
因此,我们限制了可以访问它的用户数量(不同的套餐:10、25、50 或无限制)。然而,问题是使用 ASP.NET Identity 时,允许并发登录。这意味着如果一个客户有一个 10 用户系统,他们都可以以同一用户身份登录,并且实际上具有无限的用户访问权限。因此,如果“Dave”以 Dave 身份登录,那么 Jim 可以以 Dave 身份登录,Bob、John、Stacey 和任何数量的人也可以。
我缺少的是一种强制并发登录注销的方法,如果是同一个用户的话。因此,如果 Bob 尝试以 Dave 身份登录,则 Dave(原始登录名)将被注销。
我找到了一些示例,这些示例在某种程度上解决了这个问题,但它们有点过时,而且是针对 MVC 的。
最佳答案
我能够通过使用 cookie 身份验证和异步方法更新安全标记来解决问题。
基本上,用户的登录信息存储在 cookie 中,每次加载页面时都会对其进行验证。当其他人使用相同的用户名登录(或同一用户使用不同的浏览器登录)时,它会更新安全标记(导致当前登录的任何人失效),然后使用更新的标记继续让用户登录。在登录屏幕上,我的“登录”按钮的登录事件是:
protected async void LogIn(object sender, EventArgs e)
然后在下面的方法体中,我们有:
await signinManager.UserManager.UpdateSecurityStampAsync(user.Id);
await signinManager.PasswordSignInAsync(Username.Text, Password.Text, true, false);
Response.Redirect("~/Default.aspx");
这将确保每次用户登录时,他们的 SecurityStamp 都会更新并存储在数据库中。只要用户在同一个浏览器中返回该站点,他们的登录就会被保留。但是,如果任何用户在不同的浏览器中落后于他们并使用相同的凭据登录,则第一个帐户将被注销。
关于c# - ASP.NET 身份并发登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43217288/