Ответ 1
Основная проблема заключается в том, что требование, представляющее имя пользователя, не обновляется в ClaimsIdentity
вы используете на последнем этапе.
Самый простой способ выполнить обновление - использовать SignInManager<TUser, TKey>.SignIn
метод
signInManager.SignIn(identityUser, isPersistent: false, rememberBrowser: false);
Это также идиоматический способ ASP.NET Identity, поскольку он использует связанный IClaimsIdentityFactory
для создания претензий в отношении новых идентификаторов.
Полный пример
static async Task<IdentityResult> UpdateEmailAsync<TUser>(
IPrincipal principal,
UserManager<TUser, string> userManager,
SignInManager<TUser, string> signInManager,
string newEmail
)
where TUser : class, IUser<string>
{
string userId = principal.Identity.GetUserId();
IdentityResult result = await userManager.SetEmailAsync(userId, newEmail);
if (result.Succeeded)
{
// automatically confirm user email
string confirmationToken = await userManager.GenerateEmailConfirmationTokenAsync(userId);
result = await userManager.ConfirmEmailAsync(userId, confirmationToken);
if (result.Succeeded)
{
TUser user = await userManager.FindByIdAsync(userId);
if (user != null)
{
// update username
user.UserName = newEmail;
await userManager.UpdateAsync(user);
// creates new identity with updated user name
await signInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
// succeded
return result;
}
}
// failed
return result;
}
Тогда вы можете просто позвонить из своего кода
string newEmail = AntiXssEncoder.HtmlEncode(value.Email, true);
IdentityResult result = await UpdateEmailAsync(identityUser, UserManager, SignInManager, newEmail);
if (result.Succeeded)
{
return Ok();
}