2013-03-02 60 views
1

我在MVC4應用程序中使用SimpleMembership,並且需要用戶更改自己的用戶名的功能。SimpleMembership正在更改用戶名

我有功能工作,所以當用戶更改他們的用戶名它的作品。但是,當調用諸如Roles.IsUserInrole()之類的東西時,它會失敗,因爲User.Identity.Name被設置爲他們登錄的內容,而不是新值。該值不再存在於數據庫中,因爲它們已更改名稱。

我看不到用戶名更新登錄用戶上下文的方法。大多數情況下,我可以在會話中存儲用戶ID並在進行查詢時檢索它,但是我使用Roles方法在視圖中顯示失敗的數據。

任何想法?

謝謝!

回答

0

我不認爲你能夠改變用戶名字段(如果你能告訴我你是如何實現這一目標的話,會很好)。

我看到的唯一解決方案是強制用戶在更改用戶名後註銷,因此當他們重新登錄時他們將擁有正確的User.Identity.Name。

+0

你也可以要求用戶輸入時,用戶更改用戶名的密碼,它增強了安全性,加上這意味着你可以註銷用戶並馬上將它們重新登錄(例如,參見David的答案),因此會話帳戶信息將是正確的。 – raf 2014-09-10 02:43:13

5

這是我目前(工作)解決方案:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(AccountEditModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      if (HasSensitiveInformationChanged(model)) // model.EmailAddress.ToLower() != User.Identity.Name.ToLower() 
      { 
       if (Membership.ValidateUser(User.Identity.Name, model.Password)) // && WebSecurity.IsCurrentUser(User.Identity.Name)) //redundant? 
       { 
        using (UsersContext db = new UsersContext()) 
        { 
         UserProfile user = db.UserProfiles.FirstOrDefault(u => u.EmailAddress.ToLower() == User.Identity.Name.ToLower()); 

         if (user != null) 
         { 
          user.EmailAddress = model.EmailAddress; 
          db.SaveChanges(); 
          WebSecurity.Logout(); 
          WebSecurity.Login(model.EmailAddress, model.Password); 
          return RedirectToAction("Index", "Search"); 
         } 
         else 
         { 
          ModelState.AddModelError("", "Could not find user. Please try logging in again."); 
         } 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("","Could not change email address. Please verify your password and try again."); 
       } 
      } 
      else 
      { 
       //no change 
       return RedirectToAction("Index", "Search"); 
      } 
     } 

     return View("Index", model); 
    }