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.

¿Fue útil?

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()))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top