Как я могу изменить имя пользователя для входа в систему? - PullRequest
0 голосов
/ 07 марта 2019

После скаффолдинга в файлах просмотра для Identity, я смотрю на Areas\Identity\Pages\Account\Manage\index.cshtml, чтобы посмотреть, смогу ли я каким-либо образом установить имя пользователя на что-то, кроме адреса электронной почты. В представлении поле ввода для Username равно disabled:

<input asp-for="Username" class="form-control" disabled />

Я удалил «disabled», ввел имя и сохранил форму, но адрес электронной почты просто вернулся.

Я уверен, что мне здесь не хватает чего-то фундаментального. Должны ли пользователи иметь реальные имена в системе членства?

UPDATE Я нашел этот учебник, но теперь я слишком устал, чтобы читать его. Я сделаю это утром: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-2.2&tabs=visual-studio

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Да, вам лучше наследовать от базового IdentityUser класса и добавить туда то, что вам нужно.

1. Наследовать от IndentityUser

using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations;

namespace DL.SO.Infra.CrossCutting.Identity.Entities
{
    public class AppUser : IdentityUser<int>
    {
        [Required]
        public string FirstName { get; set; }

        [Required]
        public string LastName { get; set; }

        public string DisplayName => $"{ FirstName } { LastName }";

        public AppUserStatus Status { get; set; }
    }

    // This is in separate file, but for simplicity I would just add it here
    public enum AppUserStatus
    {
        Active = 1,
        Inactive = 2
    }
}

Вы видите здесь, что я добавил имя, поле фамилии, а также статус к пользовательской сущности приложения.

2. Создать DbContext из правильной перегрузки

Если вы добавляете дополнительную информацию в базу IdentityUser (фактически, какие-либо классы идентификаторов, которые вы изменили) или хотите изменить тип первичного ключа, вам нужно создать DbContext, используя правильную перегрузку, которую он обеспечивает.

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using DL.SO.Infra.CrossCutting.Identity.Entities;

namespace DL.SO.Infra.CrossCutting.Identity
{
    public class AppIdentityDbContext
        : IdentityDbContext<AppUser, AppRole, int, AppUserClaim, AppUserRole,
             AppUserLogin, AppRoleClaim, AppUserToken>
    {
        public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options)
            : base(options) { }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            builder.Entity<AppUser>(b =>
            {
                // Rename the column Id to UserId (optional)
                b.Property(u => u.Id).HasColumnName("UserId");

                b.ToTable("User");
            });
            builder.Entity<AppRole>().ToTable("Role");

            builder.Entity<AppUserRole>().ToTable("UserRole");
            builder.Entity<AppUserClaim>().ToTable("UserClaim");
            builder.Entity<AppRoleClaim>().ToTable("RoleClaim");
            builder.Entity<AppUserLogin>().ToTable("UserLogin");
            builder.Entity<AppUserToken>().ToTable("UserToken");
        }
    }
}

3. Зарегистрировать Identity Framework при запуске

Затем вам необходимо использовать пользовательские DbContext и классы при регистрации платформы Identity на Startup.cs. Здесь я продемонстрировал использование метода расширения, но вы также можете поместить их непосредственно в Startup.cs.

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using DL.SO.Infra.CrossCutting.Identity.Entities;
using DL.SO.Infra.CrossCutting.Identity.Settings;
using System;

namespace DL.SO.Infra.CrossCutting.Identity.Extensions
{
    public static class ServiceCollectionExtensions
    {
        public static void AddIdentityService(this IServiceCollection services,
            string connectionString, AppIdentitySettings settings)
        {
            string assemblyNamespace = typeof(AppIdentityDbContext).Namespace;

            services.AddDbContext<AppIdentityDbContext>(options =>
                options.UseSqlServer(connectionString, optionsBuilder =>
                    optionsBuilder.MigrationsAssembly(assemblyNamespace)
                )
            );

            services.AddIdentity<AppUser, AppRole>(options =>    // <-- Your custom classes
            {
                // User settings
                options.User.RequireUniqueEmail = settings.User.RequireUniqueEmail;

                // Password settings
                options.Password.RequireDigit = settings.Password.RequireDigit;
                options.Password.RequiredLength = settings.Password.RequiredLength;
                options.Password.RequireLowercase = settings.Password.RequireLowercase;
                options.Password.RequireNonAlphanumeric = settings.Password.RequireNonAlphanumeric;
                options.Password.RequireUppercase = settings.Password.RequireUppercase;

                // Lockout settings
                options.Lockout.AllowedForNewUsers = settings.Lockout.AllowedForNewUsers;
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(settings.Lockout.DefaultLockoutTimeSpanInMins);
                options.Lockout.MaxFailedAccessAttempts = settings.Lockout.MaxFailedAccessAttempts;
            })
            .AddEntityFrameworkStores<AppIdentityDbContext>()    // <-- Your custom DbContext
            .AddDefaultTokenProviders();
        }
    }
}
0 голосов
/ 07 марта 2019

Оказывается, что поле Username не предназначено для хранения полного имени пользователя, но вы должны добавить поля, такие как полное имя, дата рождения и т. Д., В базовый класс по мере необходимости.

Этот документ описывает, как это сделать: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-2.2&tabs=visual-studio

...