繁体   English   中英

如何使用简单成员资格在MVC 4应用程序中更改用户名和密码

[英]How to change username and password in MVC 4 application using Simple membership

我正在使用简单的成员资格提供程序构建MVC 4 Web应用程序,并且具有管理权限,可以在其中编辑用户名和密码。当我只编辑用户名或密码时,可以,但是当我尝试同时编辑用户名和密码时当我尝试使用新用户名登录时,尽管数据库中的记录已更改,但用户列表中显示的UserProfiles用户名是旧用户名。这是一个代码示例:

[HttpPost]
    public ActionResult EditUser(RegisterUserModel model, FormCollection form)
    {
        if (ModelState.IsValid)
        {
            var oldUserName = form["userHidden"];
            var newUserName = model.UserName;
            bool isOldPassword = Membership.ValidateUser(oldUserName , model.Password);

            if (!isOldPassword)
            {
                var token = WebSecurity.GeneratePasswordResetToken(oldUserName );

                try
                {
                    //Reset password using the reset token and the new password
                    WebSecurity.ResetPassword(token, model.Password);

                }
                catch (Exception e)
                {
                    ModelState.AddModelError("", String.Format("{0} Exception caught.", e));
                }
            }

            if (newUserName != null && oldUserName != null)
            {
                if (newUserName.ToLower() != oldUserName.ToLower())
                {
                    myRepository.ChangeUserName(oldUserName, newUserName);
                    myRepository.Save();
                }
            }

            return RedirectToAction("Users", "Administration");
        }

        ModelState.AddModelError("", "Please enter correct username and password.");
        return View(model);
    }

这是我的ChangeUserName方法:

public void ChangeUserName(string oldUserName, string newUserName)
    {
        var userToUpdate = (from user
                            in context.Users
                            where user.Username == oldUserName
                            select user).FirstOrDefault();

        if (userToUpdate != null)
        {
            var updatedUser = new Users();
            updatedUser.UserId = userToUpdate.UserId;
            updatedUser.UserName = newUserName;

            context.Entry(userToUpdate).CurrentValues.SetValues(updatedUser);
        }
    }

我已经像这样扩展了我的会员资格:

public class ExtendMembership
{
    private static IMyRepository myRepository= new MyRepository(new MyEntities());

    public static bool ValidateUser(string username, string password, string companyName)
    {
        int companyId = myRepository.GetCompanyName(companyName);

        int? userId = companyId == 0 ? null : GetUserId(username, companyId);

        if (userId.HasValue && userId.Value != 0)
        {
            var userKeyToCompany = username + "@" + companyName.ToLower();
            return WebSecurity.Login(userKeyToCompany , password);
        }
        else
        {
            return false;
        }
    }

    private static int? GetUserId(string username, int companyId)
    {
        var userId = (from users
                      in myRepository.GetUsers()
                      where (users.UserName.ToLower() == username.ToLower()) && (users.CompanyId == companyId)
                      select users.UserId).FirstOrDefault();
        return userId;
    }
}

GetUserId方法获取公司的用户ID

您应该考虑使用构造而不是静态存储库。 如果您处理大量请求,则静态存储库将触发。 这是您可以使用的使用示例:

using(var myRepository = new MyRepository(new MyEntities())) {
   ... code here
} 

事实证明,我的GetUserId方法应该在MyRepository中在更改后的上下文中实现,并且更改密码和更改用户名操作也应分开。 一切都解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM