我有一个ASP.NET Web窗体应用程序。此应用程序不是内部使用的,而是安装在服务器上并出售给将在内部使用它的客户。
因此,我们限制了可以访问它的用户数量(不同的包:10,25,50或无限制)。但问题是,使用ASP.NET Identity时,允许并发登录。这意味着如果客户拥有10个用户的系统,他们都可以作为同一个用户登录,并且实际上可以无限制地访问用户。因此,如果“Dave”以Dave身份登录,那么Jim可以像Dave一样登录,Bob,John,Stacey以及任何人都可以登录。
我缺少的是强制并发登录注销的方法,如果是同一个用户。因此,如果Bob尝试以Dave身份登录,则Dave(原始登录名)将被注销。
我发现了一些有些解决这个问题的例子,但它们有点过时了,而且是针对MVC的。
答案 0 :(得分:3)
我能够通过使用cookie身份验证和异步方法来更新安全戳来解决问题。
基本上,用户的登录信息存储在cookie中,该cookie在每次页面加载时都会得到验证。当其他人使用相同的用户名登录(或者同一用户使用其他浏览器登录)时,它会更新安全标记(导致当前登录的任何人失效),然后使用更新的标记继续登录用户。在登录屏幕上,我的"登录"按钮的LogIn事件是:
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都会更新并存储在数据库中。只要用户在同一浏览器中返回该站点,他们的登录将被保留。但是,如果任何用户在不同的浏览器中使用相同的凭据并使用相同的凭据登录,则第一个帐户将被注销。