SimpleMembership更改用户名

时间:2013-03-02 05:47:32

标签: c# asp.net-mvc-4 simplemembership

我在MVC4应用中使用SimpleMembership,并且需要用户能够更改自己的用户名。

我的功能正常运行,因此当用户更改其用户名时,它可以正常运行。但是,当调用Roles.IsUserInrole()之类的东西时,它会失败,因为User.Identity.Name设置为他们登录的内容,而不是新值。数据库中不再存在该值,因为它们已更改其名称。

我无法看到使用用户名更新登录用户上下文的方法。在大多数情况下,我可以在会话中存储用户ID并在进行查询时检索它,但是我使用Roles方法在视图中显示失败的数据。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:0)

我认为您无法更改用户名字段(如果您能告诉我您是如何实现的,那就太好了)。

我看到的唯一解决方案是强制用户在更改用户名后注销,因此当他们重新登录时,他们将拥有正确的User.Identity.Name。