asp.net - route - ¿Cómo agregar reclamo al usuario dinámicamente?
select asp-for asp-items (0)
Quiero guardar una pequeña información (por ejemplo, la ID del dispositivo del usuario) sobre el usuario, después o durante el inicio de sesión. Esta información es dinámica, y me gustaría que la búsqueda sea muy rápida (sin acceso a la base de datos), ya que la necesito en muchos controladores. Traté de agregarlo a las afirmaciones del usuario de esta manera:
((ClaimsIdentity)User.Identity).AddClaim(new Claim("UserDeviceId", userDeviceId));
para luego recuperarlo así: User.FindFirstValue("UserDeviceId")
dentro de cualquier controlador. ¡Pero parece que los datos no se mantienen entre las solicitudes! Devuelve NULL en otra solicitud HTTP.
Utilizo SingInManager.PasswordSignIn () para iniciar sesión en el usuario. No tengo ninguna tienda de reclamos: no uso la implementación de Identity EF predeterminada, proporciono mis propias tiendas (implementaciones IUserStore, IUserPasswordStore e IUserRoleStore). Pero incluso si lo hiciera, estos datos son dinámicos y no deberían persistir ni recuperarse desde ningún almacenamiento. Los datos están disponibles al iniciar sesión (básicamente, la aplicación del cliente envía la identificación del hardware).
Según entiendo, el reclamo agregado dinámicamente se borra porque nunca se inyecta en la cookie, cuando lo agrego a User.Identity
solo agrega a la instancia en memoria, que la cookie sobreescribe en la próxima solicitud. (o al menos esa es mi mejor suposición).
¿Hay alguna solución a este problema? Realmente me gustaría evitar configurar el mecanismo de sesión, todo lo que necesito es un pequeño valor persistente entre las solicitudes, y aunque estrictamente hablando no califica completamente como un "reclamo del usuario", es (conceptualmente) muy cercano - es una identificación de dispositivo desde la que el usuario está conectado actualmente.
Uso User.FindFirstValue(ClaimTypes.NameIdentifier)
en mis controladores para obtener userId sin ningún impacto en el rendimiento, y es muy conveniente. Está configurado por Identity en sí, obviamente. Me gustaría tener un mecanismo similar para otro identificador, preferentemente sin reescribir la mitad de Asp.Net Identity :) ¿Es eso factible? De lo contrario, ¿cuál es mi mejor alternativa (además de configurar el almacenamiento de la sesión o proporcionar el valor en cada solicitud)?