2017-04-04 161 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被更新並存儲在數據庫中。只要用戶在同一瀏覽器中返回該網站,他們的登錄將會持續。但是,如果任何用戶在不同的瀏覽器中使用相同的憑據登錄後,則第一個帳戶將被註銷。