我如何在 cookie 上保留 ASP.NET 身份声明直到注销?

How do I persist a ASP.NET Identity Claim on a cookie until logout?

我正在制作一个使用 Identity 的 ASP.NET MVC 5 应用程序。身份验证的一部分包括将声明存储在 cookie 中,而不将其保存到数据库中,因为该声明只能持续到用户注销为止。此声明在注销后添加到用户身份,并且用户可以在登录时随时更改声明的值。为此,我使用以下代码:

var AuthenticationManager = HttpContext.GetOwinContext().Authentication;
var Identity = User.Identity as ClaimsIdentity;
if (Identity.HasClaim(c => c.Type == "custom"))
{
    Identity.RemoveClaim(Identity.FindFirst("custom"));
}
Identity.AddClaim(new Claim("custom", "value", ClaimValueTypes.Integer32));
AuthenticationManager.AuthenticationResponseGrant =
            new AuthenticationResponseGrant(new ClaimsPrincipal(Identity), new AuthenticationProperties { IsPersistent = true });

这在一段时间内工作正常...但是在用户登录后大约十分钟,索赔就消失了!我怎样才能使声明在注销之前一直存在?

您的问题是 Startup.Auth.cs 中配置的 SecurityStampValidator 正在擦除存储在 cookie 中的自定义声明。

您需要查看 ConfigureAuth(IAppBuilder app) 中的这段代码:

OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
    validateInterval: TimeSpan.FromMinutes(10),
    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),

特别是函数传递 user.GenerateUserIdentityAsync(manager))

您需要修改此方法 ApplicationUser.GenerateUserIdentityAsync 以恢复您的自定义声明(如果它们存在于 cookie 中)。