Обновление значений утверждений в ASP.NET One Core

У меня есть веб-приложение в MVC 6 (Asp.Net One Core), и я использую аутентификацию на основе утверждений. В методе входа в систему я устанавливаю претензии:

var claims = new Claim[]
{
    new Claim("Name", content.Name),
    new Claim("Email", content.Email),
    new Claim("RoleId", content.RoleId.ToString()),
};

var ci = new ClaimsIdentity(claims, "password");
await HttpContext.Authentication.SignInAsync("Cookies", new ClaimsPrincipal(ci));

Теперь, если пользователь, например, меняет адрес электронной почты в профиле пользователя, как я могу изменить значение адреса электронной почты для претензии «Электронная почта»? Мне нужно снова использовать SignOutAsync и SignInAsync, чтобы обновить файл cookie? Лучшее решение - сохранить это в классическом сеансе? Есть лучшее решение? Я совсем не прав?

Какие-либо предложения?


person Martín    schedule 18.08.2016    source источник


Ответы (2)


Мне нужно снова использовать SignOutAsync и SignInAsync, чтобы обновить файл cookie?

Ответ - да.

Самый простой способ — вручную выйти и войти (снова создать заявки) в том же методе действия, при котором вы обновляете сообщение электронной почты.

Лучшее решение - сохранить это в классическом сеансе?

Я предлагаю этого не делать. Явное использование состояния сеанса является плохой практикой в ​​ASP.Net MVC.

person Win    schedule 18.08.2016
comment
Если я выйду из системы и войду снова, чтобы снова создать претензии, информация будет доступна в данный момент, или страницу необходимо обновить, чтобы обновить файл cookie или что-то в этом роде? - person Martín; 18.08.2016
comment
Старая информация по-прежнему привязана к объекту Principal, поэтому вам не нужно выполнять дополнительный процесс с использованием Principal в том же запросе. - person Win; 18.08.2016
comment
Добавлю это здесь на случай, если кто-то столкнется с этим: в моем случае я хотел сразу использовать новую информацию о претензии в том же запросе. Для этого я вызываю _userManager.GetClaimsAsync() для этого пользователя вместо чтения утверждений в объекте Principal. Претензии там старые. Вызов GetClaimsAsync() даст вам новые, которые вы только что установили. Таким образом, в основном вам нужно 1) вызвать RefreshSignInAsync, 2) вызвать GetClaimsAsync, если вы хотите немедленно работать с новыми утверждениями. - person Andrew; 02.10.2018

Другой вариант вместо SignOutAsync и SignInAsync — использовать RefreshSignInAsync.

Пример:

var user = await _userManager.FindByIdAsync(yourId);
await _signInManager.RefreshSignInAsync(user);

Просмотрите код RefreshSignInAsync в SignInManager (net 5.0.8): https://github.com/dotnet/aspnetcore/blob/ae2eabad0e49302d0632a7dde917fdc68d960dc4/src/Identity/Core/src/SignInManager.cs#L170

person Alex    schedule 26.11.2016
comment
можно ли использовать этот метод для обновления требований другого пользователя? - person liang; 03.04.2018
comment
Как я могу получить доступ к объекту SignInManager, если я не добавил идентификатор, поскольку он мне не нужен? - person DSA; 16.04.2018
comment
@DSA ты не знаешь. SignInManager является частью Identity. - person Alex; 26.04.2018
comment
Как тогда обновить заявку пользователя different? - person liang; 10.07.2019
comment
Я видел это, это не ответило на вопрос. Поскольку в нем не было ответа, как обновить заявку другого пользователя. Хотя это, вероятно, вопрос, отличный от исходного, вероятно, следует начать новую тему. - person liang; 10.07.2019
comment
Вы не можете принудительно обновить заявку другого пользователя. - person Alex; 10.07.2019