如何更改登录用户的用户名?

问题描述 投票:0回答:2

在Identity的视图文件中搭建脚手架后,我正在查看Areas\Identity\Pages\Account\Manage\index.cshtml,看看我是否能以某种方式将用户名设置为电子邮件地址以外的其他名称。在视图中,Username的输入字段是disabled

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

我删除了“disabled”,输入了一个名称并保存了表单,但电子邮件地址刚刚弹出。

我敢肯定我在这里缺少一些基本的东西。用户必须能够在会员系统中拥有真实姓名吗?

更新我找到了这个教程,但现在我已经厌倦了阅读它。我会在早上试一试:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-2.2&tabs=visual-studio

asp.net-core-identity asp.net-core-2.2
2个回答
0
投票

事实证明,字段Username不是用来保存用户的全名,而是应该根据需要在基类中添加全名,出生日期等字段。

这篇文档描述了如何做到这一点:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-2.2&tabs=visual-studio


0
投票

是的,你最好从基础IdentityUser类继承并添加你需要的东西。

1. Inherit from 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. Create DbContext from correct overload

如果您在基础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. Register Identity Framework at Startup

然后,您需要在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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.