在View Identity

时间:2015-10-10 09:36:35

标签: c# asp.net-mvc asp.net-identity

我有一个扩展类包括这样的方法:

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()调用的名称未更新。

如果用户注销系统并再次登录,则视图中显示的名称将更改为上次更新。

我有一个解决方案,可以在集体操作后再次登录并登录以更新用户信息。没有注销会有其他解决方案吗?

2 个答案:

答案 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))
            }
        });