Файл cookie личных данных теряет информацию о пользовательских запросах через определенный промежуток времени

Я сохраняю пользовательские требования, такие как реальное имя пользователя, в cookie-среде ASP.NET Identity, чтобы избежать ненужных запросов к базе данных при каждом запросе. По крайней мере, я полагаю, что этот код делает:

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 содержит следующие утверждения, как ожидалось:

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: [email protected]
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 истекает и переиздается за кулисами, но я не знаю, почему (или если) это произойдет.

Ответы

Ответ 1

Да, проблема, скорее всего, срок действия файла 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))
            }
        });