Reutilizar reclamo en regenerateIdentityCallback en Owin Identity en MVC5
-
21-12-2019 - |
Pregunta
Estoy usando MVC5 con identidad Owin.
Estoy luchando por reutilizar cualquier reclamo personalizado en regenerateIdentityCallback.
Tengo en Inicio esta configuración (como se proporciona en la Plantilla estándar para el nuevo proyecto MVC)
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, Guid>(
validateInterval: TimeSpan.FromSeconds(10),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (user) => Guid.Parse(user.GetUserId()))
}
});
GenerateUserIdentityAsync se ve así:(además de lo estándar de la Plantilla)
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, Guid> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// I want here instead of generating new one, just reuse the previous one
userIdentity.AddClaim(new Claim(ClaimTypes.Sid, Guid.NewGuid().ToString()));
return userIdentity;
}
El problema es que no puedo reutilizar el reclamo y siempre tengo que obtener un nuevo valor por él.Después de investigar el dll de identidad, veo que this
La instancia del usuario no tiene reclamos ya que es un usuario nuevo de la base de datos y userIdentity
solo tiene los reclamos estándar como ID y nombre de usuario, que se crean mediante el método CreateIdentityAsync.No es posible obtener el usuario de HttpContext.Current, es nulo en este lugar.
¿Cuál es la mejor manera de reutilizar un Claim para conservar algunos valores de la Cookie?Probablemente entendí mal el propósito de Claims.Gracias de antemano por su ayuda.
Solución
Puede obtener el mismo resultado haciendo esto (contexto. Identidad es la identidad anterior):
OnValidateIdentity = context => SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
validateInterval: TimeSpan.FromSeconds(30),
regenerateIdentityCallback:
(manager, user) =>
user.GenerateUserIdentityAsync(manager, context.Identity),
getUserIdCallback: (ci) => Guid.Parse(ci.GetUserId())).Invoke(context)
Otros consejos
Me di por vencido y creé mi propio SecurityStampValidator
que hace exactamente lo mismo que el original, pero pasa el ClaimsIdentity actual a regenerateIdentityCallback como parámetro.No estoy nada contento con esta solución, pero funciona.
OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
validateInterval: TimeSpan.FromSeconds(10),
regenerateIdentityCallback: (manager, user, previousIdentity) => user.GenerateUserIdentityAsync(manager, previousIdentity),
getUserIdCallback: user => Guid.Parse(user.GetUserId()))