2012-03-23 123 views
1

我希望登錄框中的功能可以自動填入用戶名和密碼,前提是用戶以前曾在網站上登錄併成功登錄過。我看到這在許多網站上實施,所以我想通過這種方式來做到這一點,而不會產生安全風險。ASP.NET MVC4使用cookie記住登錄密碼 - 安全的方式?

編輯:根據崗位,這是一個瀏覽器的功能,不應該用代碼來實現,因爲它從來沒有安全存儲密碼的任何地方。

編輯代碼以反映我只存儲用戶名的新方向。但是,林不知道該看什麼,看看它的工作。我嘗試登錄然後註銷,然後再次登錄屏幕,但視圖加載時,用戶名框仍然爲空。不知道它的代碼或我測試它的方式是錯誤的。

登錄POST:

 [HttpPost] 
    public ActionResult Login(LoginModel model) 
    { 

     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);      
       return Json(new { ok = true, message = "Login successful." }); 
      } 
     } 

     return Json(new { ok = false, message = "The username or password you entered is invalid. Please try again." }); 
    } 

登錄GET:

[HttpGet] 
    public ActionResult Login(string path) 
    { 
     LoginModel model = new LoginModel(); 

     HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName.ToString()]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      if (authTicket != null & !authTicket.Expired) 
      { 
       model.UserName = authTicket.UserData; 
      } 
     } 

     return PartialView(path, model); 
    } 

回答

2

有幾個問題與您的代碼。第一個是您將Cookie添加到Request對象,而不是將其添加到Response =>Response.Cookies.Add(authCookie);

的第二個問題是,你正在創建一個非持久性cookie意味着它將只活通過瀏覽器會話。一旦用戶關閉瀏覽器,它將永遠消失,因爲它永遠不會存儲在客戶端計算機上。爲了創建一個persistent cookie,你需要爲它指定一個到期日期,這明顯對應於這個cookie將在客戶端計算機上保存多久。例如,如果你要記住5天:

HttpCookie authCookie = new HttpCookie("authCookie", "cookieValue") 
{ 
    Expires = DateTime.Now.AddDays(5) 
}; 

的另一個問題是,你只存儲的cookie裏面的密碼的MD5哈希值,你希望能夠對其進行解密後與FormsAuthentication.Decrypt這是不可能。此方法可以解密使用Encrypt方法加密的值。

而且他們所有的最大的問題是安全性:你永遠不應該在任何地方存儲任何密碼相關的東西。用戶名應該足夠了。瀏覽器提供記住給定站點密碼的可能性。我會建議你使用這個功能而不是做你正在做的事情。

另一種可能性是,當用戶登錄到發出持續的身份驗證Cookie,這樣即使用戶關閉作爲身份驗證您在此驗證cookie規定的有效期內,他會被記住的瀏覽器。

+0

感謝您的回覆。我現在意識到,我把這個功能誤認爲是事實上它是一個瀏覽器功能。所以我決定把它留給瀏覽器輸入密碼。決定只在cookie中存儲用戶名,以便在下次訪問時自動填寫登錄框。我在原文中編輯了我的代碼,但我仍然認爲我做錯了什麼。請大家看看,非常感謝 – parliament 2012-03-24 08:46:34

0

你並不需要實際的密碼,爲用戶確保他在先前記錄。你甚至不應該在數據庫中保存實際的密碼。您通常只保存該密碼的鹽漬散列。當用戶登錄時,您會爲該密碼創建一個散列,並將其與存儲在數據庫中的散列進行比較。如果他們匹配,他輸入了正確的密碼。

至於在cookie中存儲的登錄信息,我會然後存儲在cookie該密碼哈希的哈希鹽漬。在GET之後,您只需創建存儲的密碼哈希的哈希散列並將其與來自cookie的哈希進行比較。如果它們匹配,則登錄cookie有效。這樣你永遠不會在任何地方存儲任何用戶密碼。

爲了使這更安全,登錄頁面應該由SSL進行保護,否則密碼將至少一次進行加密傳輸。

-2

如果您使用的是SQL,您可以在用戶首次登錄時生成一個隨機數。將此號碼存儲在用戶表中,並在用戶機器上存儲爲cookie。然後用戶可以通過比較隨機數和存儲在服務器上的隨機數進行認證。

雖然時間戳登錄是一個好主意,但它會在一段時間後過期。