Estructura básica del aspecto Identity

using Microsoft.AspNetCore.Identity;
using System;

namespace Microsoft.AspNetCore.Identity
{

    //     Represents a user in the identity system

    //   TKey:
    //     The type used for the primary key for the user.
    public class IdentityUser<TKey> where TKey : IEquatable<TKey>
    {

        //     Initializes a new instance of Microsoft.AspNetCore.Identity.IdentityUser`1.
        public IdentityUser();

        //     Initializes a new instance of Microsoft.AspNetCore.Identity.IdentityUser`1.

        public IdentityUser(string userName);

        //     Gets or sets the date and time, in UTC, when any user lockout ends.
        //     A value in the past means the user is not locked out.
        public virtual DateTimeOffset? LockoutEnd { get; set; }

        //     Gets or sets a flag indicating if two factor authentication is enabled for this
        //     user.
        [PersonalData]
        public virtual bool TwoFactorEnabled { get; set; }

        //     Gets or sets a flag indicating if a user has confirmed their telephone address.
        [PersonalData]
        public virtual bool PhoneNumberConfirmed { get; set; }

        //     Gets or sets a telephone number for the user.
        [ProtectedPersonalData]
        public virtual string PhoneNumber { get; set; }

        //     A random value that must change whenever a user is persisted to the store
        public virtual string ConcurrencyStamp { get; set; }

        //     A random value that must change whenever a users credentials change (password
        //     changed, login removed)
        public virtual string SecurityStamp { get; set; }

        //     Gets or sets a salted and hashed representation of the password for this user.
        public virtual string PasswordHash { get; set; }

        //     Gets or sets a flag indicating if a user has confirmed their email address.
        [PersonalData]
        public virtual bool EmailConfirmed { get; set; }

        //     Gets or sets the normalized email address for this user.
        public virtual string NormalizedEmail { get; set; }

        //     Gets or sets the email address for this user.
        [ProtectedPersonalData]
        public virtual string Email { get; set; }

        //     Gets or sets the normalized user name for this user.
        public virtual string NormalizedUserName { get; set; }

        //     Gets or sets the user name for this user.
        [ProtectedPersonalData]
        public virtual string UserName { get; set; }

        //     Gets or sets the primary key for this user.
        [PersonalData]
        public virtual TKey Id { get; set; }

        //     Gets or sets a flag indicating if the user could be locked out.
        public virtual bool LockoutEnabled { get; set; }

        //     Gets or sets the number of failed login attempts for the current user.
        public virtual int AccessFailedCount { get; set; }

        //     Returns the username for this user.
        public override string ToString();
    }
}

Pero no necesito muchos campos (como EmailConfirmed y algunos otros).

Pero necesito agregar algunos campos personalizados de tipo simple ( cadena, int ) y algún campo para una relación de muchos a muchos ( Lista ) igual que la relación Usuarios + Roles < em> "Usuarios - Roles de usuarios - Roles" .

¿Cómo se puede hacer esto sin perder la funcionalidad y la capacidad de utilizar completamente Identity

0
Frip 23 abr. 2020 a las 18:24

2 respuestas

La mejor respuesta

No puede eliminar ninguna de las propiedades integradas. Están allí para admitir la funcionalidad de identidad. Ya sea que realmente requiera o no la confirmación por correo electrónico, es valioso saber si el correo electrónico ha sido confirmado o no.

Agregar propiedades adicionales funciona como lo haría cualquier otra entidad. Cree una clase, si aún no lo ha hecho, que herede de IdentityUser y agregue las propiedades que desee.

2
Chris Pratt 23 abr. 2020 a las 16:00

No puede eliminar campos en IdentityUser, pero aún puede agregar los suyos, simplemente obtenga su clase de usuario de IdentityUser y luego use una sobrecarga que tome su clase de usuario como parámetro de tipo (services.AddIdentity<MyApplicationUser, IdentityRole>(...)). Sus propiedades personalizadas estarán presentes siempre que obtenga la instancia de usuario de UserManager<MyApplicationUser>. Luego puede ignorar aquellos que no desea (por ejemplo, establecería EmailConfirmed en verdadero cuando esté creando sus usuarios y luego lo olvide).

Desafortunadamente, eso solo funciona para tipos de datos simples, si necesita relaciones personalizadas con otras entidades, su única opción podría ser reemplazar partes de Identity con las suyas. Tuve que hacer algo como esto (reemplazar todo el rol / reclamo de parte de la identidad con algo personalizado), y no fue bonito: en netcore 2.1 implicaba cosas como escribir un almacén de usuarios personalizado y eliminar manualmente algunos servicios de ServiceCollection después de la identidad registro.

Netcore actual parece tener AddIdentityCore<TUser>(this IServiceCollection) y el único requisito en TUser es que sea un tipo de referencia (where TUser : class), por lo que comenzaría allí si realmente tiene que hacerlo. Es probable que aún tenga que implementar su propia tienda de usuarios que sepa cómo obtener reclamos de su clase de usuario: prepárese para invertir al menos un día en esto.

0
huancz 23 abr. 2020 a las 16:16