2017-04-04 102 views
1

我有一个ASP.NET Web窗体应用程序。此应用程序不是内部使用的,而是将安装在服务器上并出售给将在内部使用它的客户。因此,我们限制了可以访问它的用户数(不同的包:10,25,50或无限制)。但是,问题在于,使用ASP.NET身份验证时,允许并发登录。这意味着,如果客户拥有10个用户的系统,他们都可以作为同一用户登录,并且实际上可以无限制地访问用户。因此,如果“Dave”以Dave的身份登录,那么Jim可以以Dave身份登录,Bob,John,Stacey以及任何人都可以登录。ASP.NET身份并发登录

我缺少的是一种强制并发登录注销的方法,如果是同一个用户。所以如果Bob试图以Dave的身份登录,那么Dave(原始登录名)会被注销。

我发现了一些有点解决这个问题的例子,但他们有点过时了,并且是针对MVC的。

+0

根据您在应用程序中检查安全性的方式,您可以杀死所有以前生成的令牌等,以便为用户工作,以便只有最新的登录才能正常工作。但是,如果你没有验证应用程序内的用户(至少在每个页面加载和/或Ajax请求时说),那么你将会遇到更多麻烦。你能分享一下你的系统是如何工作的,因为身份是高度可定制的,每个人都倾向于创造自己的风格。 – Kyle

+0

@Kyle现在,我只使用基本功能。我开始使用ASP.NET的模板,其中包括默认页面,所有帐户页面(登录,确认,管理密码等)。我只想在每次登录时验证用户,因此在这种情况下,登录时需要检查同一用户是否已登录,如果是,则强制登出。 – Saint7992

回答

2

我能够通过使用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被更新并存储在数据库中。只要用户在同一浏览器中返回该网站,他们的登录将会持续。但是,如果任何用户在不同的浏览器中使用相同的凭据登录后,则第一个帐户将被注销。