在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
事实证明,字段Username
不是用来保存用户的全名,而是应该根据需要在基类中添加全名,出生日期等字段。
这篇文档描述了如何做到这一点:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-2.2&tabs=visual-studio
是的,你最好从基础IdentityUser
类继承并添加你需要的东西。
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
}
}
你在这里看到我已经为应用程序用户实体添加了名字,姓氏字段和状态。
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");
}
}
}
然后,您需要在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();
}
}
}