![](/img/trans.png)
[英]How to get JWT authenticated sign-in user from identity claims in asp.net web api
[英]Update Identity User Claims in Web API
我目前正在嘗試將用戶的電子郵件/用戶名從移動應用程序更新為Web API項目。 我目前正在使用oauth和令牌身份驗證。 更新身份用戶時,用戶將變為未經身份驗證,因為用戶名和訪問令牌不再有效。 根據我的閱讀,我必須更新身份聲明。 這是我到目前為止所嘗試的:
var identity = new ClaimsIdentity(User.Identity);
if (result)
{
var identityUser = await UserManager.FindByNameAsync(User.Identity.Name);
identityUser.Email = AntiXssEncoder.HtmlEncode(value.Email, true);
identityUser.UserName = AntiXssEncoder.HtmlEncode(value.Email, true);
var identityResult = await UserManager.UpdateAsync(identityUser);
if(identityResult.Succeeded)
{
var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
await UserManager.RemoveClaimAsync(identityUser.Id, identity.FindFirst(ClaimTypes.Name));
await UserManager.AddClaimAsync(identityUser.Id, new Claim(ClaimTypes.Name, value.Email));
identity.RemoveClaim(identity.FindFirst(ClaimTypes.Name));
identity.AddClaim(new Claim(ClaimTypes.Name, value.Email));
authenticationManager.AuthenticationResponseGrant =
new AuthenticationResponseGrant(
new ClaimsPrincipal(identity),
new AuthenticationProperties { IsPersistent = false });
}
return Ok();
}
但是,它仍然顯示使用User.Identity.Name
時的上一封電子郵件,並且authenticationManager
的用戶聲明也未更新。 我不知道還能做什么,因為Web API沒有太多關於此的文檔。 任何幫助是極大的贊賞。
主要問題是代表用戶名稱的聲明未在最后一步中使用的ClaimsIdentity
更新。
執行更新的最簡單方法是使用SignInManager<TUser, TKey>.SignIn
方法
signInManager.SignIn(identityUser, isPersistent: false, rememberBrowser: false);
這也是一種ASP.NET身份慣用方式,因為它使用關聯的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's 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's 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.