我有一个扩展类包括这样的方法:
public static string GetName(this IPrincipal user)
{
if (user.Identity.IsAuthenticated)
{
ClaimsIdentity claimsIdentity = user.Identity as ClaimsIdentity;
foreach (var claim in claimsIdentity.Claims)
{
if (claim.Type == "Name")
{
return claim.Value;
}
}
return "";
}
else
return "";
}
更新用户表的调用操作包括Name
后,尽管数据库中的列已更改,但@User.GetName()
调用的名称未更新。
如果用户注销系统并再次登录,则视图中显示的名称将更改为上次更新。
我有一个解决方案,可以在集体操作后再次登录并登录以更新用户信息。没有注销会有其他解决方案吗?
答案 0 :(得分:0)
当用户注销并再次登录时,将使用最新更改重新生成身份验证cookie,并且用户将看到最新更新。您可以通过AuthenticationResponseGrant
方法更新身份验证Cookie:
var identity = (ClaimsIdentity)User.Identity;
identity.RemoveClaim(identity.FindFirst("Name"));
identity.AddClaim(new Claim("Name", value));
IOwinContext context = Request.GetOwinContext();
var authenticationContext = await context.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ApplicationCookie);
if (authenticationContext != null)
AuthenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(identity), new AuthenticationProperties { IsPersistent = true });
答案 1 :(得分:0)
使用声明的重点是它们是用户信息的快照。
如果检查startup.cs类,您将看到validateInterval。这是您的声明刷新的时间间隔。您可以通过更新用户安全GUID来提前强制执行此操作。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});