我有一个 ASP.NET 的Web Forms应用程序。此应用程序不是将在内部使用的东西,而是将安装在服务器上并出售给将在内部使用它的客户。
因此,我们限制了可以访问它的用户数量(不同的软件包:10、25、50 或无限制)。但是,问题是,使用 ASP.NET 标识时,允许并发登录。这意味着,如果客户有一个 10 个用户的系统,他们都可以以同一用户身份登录,并且实际上具有无限的用户访问权限。因此,如果"戴夫"以戴夫身份登录,那么吉姆可以以戴夫身份登录,鲍勃、约翰、史黛西和任意数量的人也可以。
我缺少的是一种强制并发登录注销的方法,如果是同一个用户。因此,如果 Bob 尝试以 Dave 身份登录,则 Dave(原始登录名)将被注销。
我找到了几个可以解决这个问题的例子,但它们有点过时了,并且是针对 MVC 的。
我能够通过利用 cookie 身份验证和异步方法来更新安全标记来解决此问题。
基本上,用户的登录信息存储在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 都会更新并存储在数据库中。只要用户在同一浏览器中返回站点,他们的登录就会被保留。但是,如果任何用户在不同的浏览器中落后于他们并使用相同的凭据登录,则第一个帐户将被注销。