Estoy usando MVC5 Identity 2.0 para que los usuarios inicien sesión en mi sitio web, donde los detalles de autenticación se almacenan en una base de datos SQL. Asp.net Identity se ha implementado de manera estándar, como se puede encontrar en muchos tutoriales en línea.
La clase ApplicationUser en IdentityModels se ha ampliado para incluir algunas propiedades personalizadas, como un OrganizationId entero. La idea es que se pueden crear y asignar muchos usuarios a una organización común para fines de relación de bases de datos.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
//Extended Properties
public DateTime? BirthDate { get; set; }
public long? OrganizationId { get; set; }
//Key Mappings
[ForeignKey("OrganizationId")]
public virtual Organization Organization { get; set; }
}
¿Cómo puedo recuperar la propiedad OrganizationId del usuario conectado actualmente desde un controlador? ¿Está disponible a través de un método una vez que un usuario ha iniciado sesión o siempre tengo que recuperar el OrganizationId de la base de datos, basado en el UserId, cada vez que se ejecuta un método de controlador?
Al leer en la web que he visto, necesito usar lo siguiente para iniciar sesión en el ID de usuario, etc.
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Sin embargo, OrganizationId no es una propiedad disponible en User.Identity. ¿Necesito extender User.Identity para incluir la propiedad OrganizationId? Si es así, ¿cómo hago para esto?
La razón por la que necesito el OrganizationId con tanta frecuencia es que muchas consultas de tabla dependen del OrganizationId para recuperar datos relevantes para la Organización que está asociada al usuario conectado.
Respuestas:
Siempre que desee ampliar las propiedades de User.Identity con propiedades adicionales como la pregunta anterior, agregue estas propiedades a la clase ApplicationUser primero de la siguiente manera:
Entonces, lo que necesita es crear un método de extensión como este (creo el mío en una nueva carpeta Extensiones):
Cuando cree la Identidad en la clase ApplicationUser, simplemente agregue el Reclamo -> OrganizationId así:
Una vez que haya agregado el reclamo y tenga su método de extensión, para que esté disponible como una propiedad en su Usuario. Identidad, agregue una declaración de uso en la página / archivo al que desea acceder :
en mi caso:
using App.Extensions;
dentro de un controlador y@using. App.Extensions
dentro de un archivo de vista .cshtml.EDITAR:
Lo que también puede hacer para evitar agregar una declaración de uso en cada Vista es ir a la carpeta Vistas y ubicar el archivo Web.config allí. Ahora busque la
<namespaces>
etiqueta y agregue su espacio de nombre de extensión de esta manera:Guarde su archivo y ya está. Ahora cada Vista sabrá de sus extensiones.
Puede acceder al Método de extensión:
fuente
Estaba buscando la misma solución y Pawel me dio el 99% de la respuesta. Lo único que faltaba que necesitaba para que se mostrara la Extensión era agregar el siguiente Código Razor en la página cshtml (ver):
@using programname.Models.Extensions
Estaba buscando el Nombre, para mostrar en la esquina superior derecha de mi NavBar después de que el usuario inició sesión.
Pensé en publicar esto en caso de que ayude a alguien más, así que aquí está mi código:
Creé una nueva carpeta llamada Extensiones (bajo mi carpeta de modelos) y creé la nueva clase como Pawel especificó anteriormente:
IdentityExtensions.cs
IdentityModels.cs
:Luego en mi
_LoginPartial.cshtml
(BajoViews/Shared
carpetas) agregué@using.ProgramName.Models.Extensions
Luego agregué el cambio a la siguiente línea de código que iba a usar el Nombre de usuario después de iniciar sesión:
@Html.ActionLink("Hello " + User.Identity.GetUserFirstname() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
Quizás esto ayude a alguien más en el futuro.
fuente
Echa un vistazo a esta gran publicación de blog de John Atten: ASP.NET Identity 2.0: Personalización de usuarios y roles
Tiene gran información paso a paso sobre todo el proceso. Ve a leerlo :)
Estos son algunos de los conceptos básicos.
Extienda la clase predeterminada ApplicationUser agregando nuevas propiedades (es decir, Dirección, Ciudad, Estado, etc.):
Luego agrega sus nuevas propiedades a su RegisterViewModel.
Luego actualice la Vista de registro para incluir las nuevas propiedades.
Luego actualice el método Register () en AccountController con las nuevas propiedades.
fuente
Para cualquiera que encuentre esta pregunta en busca de cómo acceder a propiedades personalizadas en ASP.NET Core 2.1, es mucho más fácil: tendrá un UserManager, por ejemplo, en _LoginPartial.cshtml, y luego simplemente puede hacerlo (suponiendo que "ScreenName" es un propiedad que ha agregado a su propio AppUser que hereda de IdentityUser):
fuente
GetUserAsync(User)
consultará la base de datos para recuperar el OrganizationId. Por el contrario, la solución aceptada incluirá el OrganizationId en los reclamos (por ejemplo, cookie). La ventaja de extraer esta información de la base de datos es que las personas pueden moverse entre las organizaciones sin necesidad de cerrar sesión / iniciar sesión. Por supuesto, la desventaja es que requiere una consulta de base de datos adicional.Dhaust ofrece una buena manera de agregar la propiedad a la clase ApplicationUser. Mirando el código OP, parece que pueden haber hecho esto o estaban en camino de hacerlo. La pregunta pregunta
Pawel ofrece una forma de agregar un método de extensión que requiere el uso de declaraciones o agregar el espacio de nombres al archivo web.config.
Sin embargo, la pregunta le pregunta si "necesita" extender User.Identity para incluir la nueva propiedad. Hay una forma alternativa de acceder a la propiedad sin extender User.Identity. Si siguió el método Dhaust, puede usar el siguiente código en su controlador para acceder a la nueva propiedad.
fuente
También agregué o extendí columnas adicionales en mi tabla AspNetUsers. Cuando solo quería ver estos datos, encontré muchos ejemplos como el código anterior con "Extensiones", etc. Esto realmente me sorprendió de que tuviera que escribir todas esas líneas de código solo para obtener un par de valores de los usuarios actuales.
Resulta que puede consultar la tabla AspNetUsers como cualquier otra tabla:
fuente