2011-01-25 57 views
2

我想在ASP.NET MVC應用程序中實現解釋here的身份驗證類型。 http://jaspan.com/improved_persistent_login_cookie_best_practiceASP.NET MVC應用程序中的持久登錄實現

我目前的實現是有一個用戶和UserLoginTokens表:

CREATE TABLE [Users].[Users] 
(
Id    int    NOT NULL, 
UserName  nvarchar(30) NULL, -- Not unique. Login by Email. 
Email   nvarchar(100) NOT NULL, 
PasswordHash nvarchar(512) NOT NULL, 
PasswordSalt nvarchar(512) NOT NULL, 
) 
CREATE TABLE [Users].[UserLoginTokens] 
(
Id   int    NOT NULL, 
UserId  int    NOT NULL, 
Token  varchar(16)  NOT NULL, 
Series  varchar(16)  NOT NULL, 
) 

用戶登錄後,他發出了用戶的cookie的內容:[email protected]&[email protected]

現在,我有PersistentLoginModule搜索這個cookie每個請求,驗證令牌和系列是有效的從它建立用戶。

我的問題:

  1. 爲了實現這一點,是不是好主意,實現自己的認證模塊,並完全不使用FormsAuthentication?

  2. 我應該在每個請求中針對數據庫驗證令牌嗎?

  3. 什麼時候應該丟棄舊的令牌並向用戶發出新的令牌?

  4. 關於數據庫的實施,如果我正確地理解,對於給定的用戶,系列總是相同的。如果是這樣,也許我應該將其移動到用戶表?

謝謝,任何幫助將非常感激!

+0

如果我是你,我會去會員。身份驗證是一項嚴謹的業務,不要輕易處理。如果你沒有正確的做法,你的應用程序可能會有一個嚴重的安全漏洞。 – alexcepoi 2011-01-25 12:56:50

回答

1

如果您打算構建自己的身份驗證模塊,那麼我會建議仍使用FormsAuthentication憑單。

的FormsAuthenticationTicket類有,你可以用它來存儲附加數據的的UserData屬性。

您可以使用靜態FormsAuthentication.Encrypt(票)FormsAuthentication.Decrypt(票)方法來存儲和檢索數據在cookie中設置。

NO。你不想每次請求都去數據庫。您可能希望在某種會話變量中存儲所提供證據的哈希值(在對數據庫驗證後)。之後您可以重新計算HASH並將其與您在當前會話期間已驗證的值進行比較(以驗證它未被篡改)。

您絕對應該對最佳實踐和身份驗證黑客進行研究。您鏈接的文章是從2006年開始的。自那時起,網絡安全方面出現了很多變化。

檢查FormsAuthenticationModule的源代碼以查看Microsoft實現如何工作(使用類似反射器的東西)。你也應該確保安裝這個KB補丁http://support.microsoft.com/kb/2416472