如何解决MVC:编辑用户后无法刷新身份声明我也是
我有一个自定义的身份基础设施实现,其中我的用户有一些可以作为声明访问的属性。
其中一些声明可由用户编辑。我的问题是,当用户保存对其个人资料的更改时,声明不会更新。
我在这方面找到了很多答案,几乎所有答案都建议注销/登录(如果使用 mvc 核心,则使用 RefreshSignInAsync)。
我尝试使用这种方法,但它不起作用 - 请参阅控制器中的 EditProfile 方法。
我认为它与 User 属性有关,但我不知道如何刷新它...
控制器:
[SGVAuthorize]
[OutputCache(VaryByParam = "*",Duration = 0,NoStore = true)]
public class AccountController : Controller
{
private SGVSignInManager _signInManager;
private SGVUserManager _userManager;
public SGVSignInManager SignInManager
{
get
{
return _signInManager ?? (_signInManager = HttpContext.GetOwinContext().Get<SGVSignInManager>());
}
private set
{
_signInManager = value;
}
}
public SGVUserManager UserManager
{
get
{
return _userManager ?? (_userManager = HttpContext.GetOwinContext().GetUserManager<SGVUserManager>());
}
private set
{
_userManager = value;
}
}
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
/*...*/
public async Task<ActionResult> EditProfile(EditProfileViewModel model,string returnUrl)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetSGVUserId());
user.MyClaimVal = model.MyClaimVal;
var result = await UserManager.UpdateAsync(user);
if (result.Succeeded)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
await SignInManager.SignInAsync(user,isPersistent: false,rememberBrowser: false);
var identity = (ClaimsIdentity)User.Identity;
var v = identity.Claims.First(x=>x.Type == "MyClaim").Value; /* STILL OLD VALUE !!!!!!!!!!!!!! */
return RedirectToLocal(returnUrl);
}
AddErrors(result);
}
return View(model);
}
}
用户:
public class SGVUser : IUser<SGVUserId>
{
public string MyClaimVal {get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<SGVUser,SGVUserId> manager)
{
/* ... */
var userIdentity = await manager.CreateIdentityAsync(this,DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("MyClaim",MyClaimVal);
/* ... */
return userIdentity;
}
public static string GetProp(this IIdentity identity,string Property)
{
try
{
var claim = ((ClaimsIdentity)identity).FindFirst(Property);
return (claim != null) ? claim.Value : string.Empty;
}
catch
{
return string.Empty;
}
}
public static string GetMyClaim(this IIdentity identity)
{
string v = GetProp(identity,"MyClaim");
return v;
}
}
用户经理:
public class SGVUserManager : UserManager<SGVUser,SGVUserId>
{
public override async Task<IdentityResult> UpdateAsync(SGVUser user)
{
/* ... */
return await base.UpdateAsync(user);
/* ... */
}
}
登录管理器:
public class SGVSignInManager : SignInManager<SGVUser,SGVUserId>
{
public override Task<ClaimsIdentity> CreateUserIdentityAsync(SGVUser user)
{
return user.GenerateUserIdentityAsync((SGVUserManager)UserManager);
}
}
商店:
public class SGVUserStore :
IUserStore<SGVUser,SGVUserId>,IUserPasswordStore<SGVUser,IUserLockoutStore<SGVUser,IUserTwoFactorStore<SGVUser,IUserEmailStore<SGVUser,SGVUserId>
{
public Task UpdateAsync(SGVUser user)
{
UpdateInDb(user.MyClaimVal);
return Task.FromResult(0);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。