ASP.Net Основной контекст MVC — Auth отличается для частичных представлений?

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

У меня есть модель, которая создает 2 частичных представления.

  • Одно частичное представление содержит форму для изменения вашего имени пользователя
  • Другой содержит форму для изменения вашего пароля

Обе формы возвращаются к методу POST в UserController . Каждый раздел независимо работает нормально. Однако, если я изменю имя пользователя, а затем попытаюсь сменить пароль, контекст аутентификации будет содержать старое имя пользователя, и я столкнусь с ошибкой.

Логика выглядит примерно так…


Изменить имя пользователя

Контроллер

 public async Task<ActionResult> ChangeUsername(ChangeUsernameViewModel model) {
    string oldUsername = model.OldUsername;
    string newUsername = model.NewUsername;

    User user = await this.UserService.GetUserById(this.Authorization.UserId);

    if (user != null)
    {
        // Update username in DB
        User user = await this.UserService.ChangeUsername(user, newUsername);

        // Update cookie
        this._owinContext.Authentication.SignIn(this.Authorization.ToClaimsIdentity());

        // Update ViewModel
        model.OldUsername = newUsername;
        model.NewUsername = string.Empty();
    }

    return View(model);
}
  

Обслуживание

 public async Task<User> ChangeUsername(User user, string newUsername) {
    // Blah blah blah... Code to update user with new username
    // and save changes to DB which is then followed by:

    // Change claim in Auth Context
    this._authorization.RemoveValue(MyClaimType.Username);
    this._authorization.AddValue(MyClaimType.Username, newUsername);

    // At this point, I can see that the Auth Context
    // has been updated with the new username.

    return user;
}
  

Сменить пароль

Контроллер

 public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model) {
    string oldPassword = model.oldPassword;
    string newPassword = model.newPassword;

    User user = await UserService.GetUserByLogin(this.Authorization.Username, oldPassword);

    // this is where the failure occurs, so I won't 
    // bother writing out the rest.

    // this.Authorization.Username is equal to "oldUsername" 
    // that we saw in the ChangeUsername method.
}
  

this._authorization В службе не переносится обратно на this.Authorization контроллер?
По какой-то причине this.Authorization отличается для каждого частичного представления?

Комментарии:

1. и используйте собственные имена => ChangeUsernameVM для изменения usernameviewmodel или, по крайней мере, ChangeUsernameVm

Ответ №1:

Очистите / сбросьте / выйдите из сеанса пользователя, перезагрузите информацию о данных сеанса с новыми данными, предоставленными пользователем или из базы данных

Комментарии:

1. Это потребовало бы обновления и дополнительного вызова базы данных. Не совсем идеально. Контекст аутентификации является переменной сеанса… разве вы не должны просто иметь возможность обновлять саму переменную без перезапуска сеанса?