2013-05-20 45 views
2

我爲我的應用程序的表單身份驗證使用WebMatrix WebSecurity。ASP.NET MVC4 WebMatrix Web安全表單身份驗證:更改用戶名

用戶需要能夠更改他的用戶名,而不用註銷。我應該調用WebSecurity.Logout(),然後是WebSecurity.Login()會做的,但Login()需要密碼。當然,我不能提供這個密碼,因爲它在數據庫中被散列。

我該如何使這項要求有效?

編輯: 下面是一些關於如何解決更改用戶名的問題的建議。

但是,我的實際問題是該cookie仍然保留舊用戶名。我發現如何處理以下說明:

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

回答

1

由於WebMatrix中WebSecurity是通過用戶ID進行,而不是用戶名,只是改變你存儲在您的用戶數據表中的數據,然後將其重定向到一個新的頁面。您不需要將它們註銷並重新登錄,我相信新用戶名將立即被接收。

+0

我會將此標記爲答案,因爲它最準確地解決了我最初的問題。 – Bertvan

+0

沒有爲我提取新的用戶名。我添加http://stackoverflow.com/a/17354255/267740 – Julian

0

您可以執行以下步驟

  1. 通過調用SimpleMembershipProvider.UpdateUser獲得通過用戶ID或用戶名
  2. 更改用戶名
  3. 現在更新用戶數據的UserDetails。

更多細節here

+0

這可能是要走的路,但我不知道如何從Controller操作調用此方法? – Bertvan

+0

好吧,有Membership.GetUser()和Membership.UpdateUser(),MemberShip.UserName是一個只讀屬性。 – Bertvan

+0

對不起,該API不允許更改用戶名。這隻能通過SP完成。請參考這篇文章[頁面中間我們有樣本] http://www.4guysfromrolla.com/articles/070109-1.aspx – Saravanan

3

所以這就是我能夠更改用戶名。這一切都發生在用於更新各種用戶數據的後操作方法中。

首先我檢查用戶名是否已經存在。 「info」是來自視圖的模型對象。

if (WebSecurity.CurrentUserName != info.UserName && 
    this.userRepository.Find(info.UserName) != null) 
{ 
    ModelState.AddModelError("", "This email is already taken."); 
    return View(); 
} 

然後我更新數據庫。

UserProfile user = this.userRepository.Find(info.UserId); 
user.UserName = info.UserName; 
this.userRepository.SaveUser(user); 

然後這裏是神奇的一部分。您必須重置授權cookie。

FormsAuthentication.SetAuthCookie(user.UserName, false); 

我希望能幫到別人。

+1

你是對的,這是魔術。設置Auth Cookie完美運行。謝謝! – PeteK68

+0

爲我工作。謝謝! – Julian