gpt4 book ai didi

asp.net - 身份 cookie 在一段时间后丢失自定义声明信息

转载 作者:行者123 更新时间:2023-12-03 20:28:44 25 4
gpt4 key购买 nike

我将自定义声明(例如用户的真实姓名)存储在 ASP.NET 身份 cookie 中,以避免对每个请求进行不必要的数据库查询。至少这就是我认为这段代码正在做的事情:

var identity = await user.GenerateUserIdentityAsync(UserManager);
identity.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName)));
// etc.
AuthenticationManager.SignIn(new AuthenticationProperties {IsPersistent=true}, identity);

这很好用,我可以通过以下方式检索这些声明:
private static string GetClaim(string claimType)
{
var identity = (ClaimsPrincipal) Thread.CurrentPrincipal;
var claim = identity.Claims.SingleOrDefault(o => o.Type == claimType);
return claim == null ? null : claim.Value;
}
identity.Claims如预期的那样,属性(property)包含以下声明:

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: ced2d16c-cb6c-4af0-ad5a-09df14dc8207
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: me@example.com
http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider: ASP.NET Identity
AspNet.Identity.SecurityStamp: 284c648c-9cc7-4321-b0ce-8a347cd5bcbf
http://schemas.microsoft.com/ws/2008/06/identity/claims/role: Admin
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname: My Name

问题是一段时间后(通常是几个小时),我的自定义声明似乎消失了——在这个例子中, givenname不再存在于枚举中。用户仍然经过身份验证,所有默认声明仍然存在。

发生了什么事,我该如何解决这个问题?我唯一能想到的是 cookie 即将到期并在幕后重新发布,但我不知道为什么(或是否)会发生这种情况。

最佳答案

是的,问题很可能是 cookie 过期了。由于您没有将自定义声明添加到数据库中的用户声明中,因此它们会在刷新时丢失,因为您没有在被调用的方法中添加声明。您可以通过以下方式添加声明:

userManager.AddClaim(user.Id, new Claim(ClaimTypes.GivenName, user.FirstName));

或者您可以将其移动到重新生成 cookie 时调用的方法中(默认情况下,它的 user.GenerateUserIdentityAsync)。
        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))
}
});

关于asp.net - 身份 cookie 在一段时间后丢失自定义声明信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com