#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. Это потребовало бы обновления и дополнительного вызова базы данных. Не совсем идеально. Контекст аутентификации является переменной сеанса… разве вы не должны просто иметь возможность обновлять саму переменную без перезапуска сеанса?