Как изменить имя пользователя и пароль в приложении MVC 4, используя простое членство

Я создаю веб-приложение MVC 4 с простым провайдером членства, и у меня есть администрация, в которой я могу редактировать имя пользователя и пароль. Когда я редактирую только имя пользователя или пароль, это нормально, но когда я пытаюсь редактировать имя пользователя и пароль одновременно когда я пытаюсь войти с новым именем пользователя, имя пользователя 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 извлекает идентификатор пользователя для компании

2 ответа

Решение

Оказывается, мой метод GetUserId должен быть в MyRepository, реализованном в измененном контексте, а также разделить действия по смене пароля и изменению имени пользователя. Это решило все.

Вы должны рассмотреть возможность использования конструкции вместо статического хранилища. Статические репозитории откроются, если вы обработаете много запросов. Вот пример использования, которое вы могли бы использовать:

using(var myRepository = new MyRepository(new MyEntities())) {
   ... code here
} 
Другие вопросы по тегам