大部分系统中都需要通过数据库保存用户、角色等信息,并且需要注册、登录、密码重置、角色管理等功能。ASP.Net Core提供了标识(identity)框架,它采用基于角色的访问控制策略,内置了对用户、角色等表的管理及相关接口,从而简化了系统的开发。标识框架还提供了对外部登录(QQ登录、微信登录等)的支持。
标识框架使用EF Core对数据库进行操作,标识框架支持几乎所有数据库。下面的示例使用SqlServer数据库。
下面从0搭建标识框架,为后面使用框架操作数据做准备工作。
目录
第一步:创建项目
创建ASP.Net Core WebApi项目,并通过nuget安装程序包
microsoft.aspnetcore.identity.entityframeworkcore
microsoft.entityframeworkcore.sqlserver
microsoft.entityframeworkcore.tools
安装完成如下图所示:
第二步:创建实体类
public class Role : IdentityRole<long>
{
}
public class User : IdentityUser<long>
{
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string? NiceName { get; set; }
}
使用自增标识列类型的主键。创建时间和昵称字段可以要,也可以不要。
第三步:创建继承自IdentityDbContext的类
public class IdDbContext : IdentityDbContext<User, Role, long>
{
public IdDbContext(DbContextOptions<IdDbContext> option) : base(option)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//从当前程序集中加载 实现了IEntityTypeConfiguration接口的实体配置类
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
可以直接通过IdDbContext类来操作数据库,不过标识框架中提供了RoleManager、UserManager等来简化对数据库的操作,这些类封装了对IdentityDbContext的操作。
第四步:注册服务
向依赖注入容器中注册与标识框架相关服务,并对相关的选项进行配置。
在Program.cs中添加如下代码:
builder.Services.AddDbContext<IdDbContext>(opt =>
{
//连接的数据库
string connStr = "Server=.;Database=idtest1;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True";
opt.UseSqlServer(connStr);
});
builder.Services.AddDataProtection();
builder.Services.AddIdentityCore<User>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 6;
options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
});
IdentityBuilder idBuilder = new IdentityBuilder(typeof(User), typeof(Role), builder.Services);
idBuilder.AddEntityFrameworkStores<IdDbContext>()
.AddDefaultTokenProviders()
.AddRoleManager<RoleManager<Role>>()
.AddUserManager<UserManager<User>>();
24-33行代码,添加标识框架的一些基础服务。因为是示例代码,所以在26-30行代码中简化了密码的一些规则。
数据库连接应该写到配置文件中,这里直接写在代码中,只是记录框架的使用,实际项目中应写在配置文件中。
第五步:EF Core数据库迁移
一些EF Core Tools命令(例如migration命令)需要在设计时创建一个派生的DbContext实例,所以创建下面这个类。
public class DbContextDesignTimeFactory : IDesignTimeDbContextFactory<IdDbContext>
{
public IdDbContext CreateDbContext(string[] args)
{
DbContextOptionsBuilder<IdDbContext> builder = new DbContextOptionsBuilder<IdDbContext>();
builder.UseSqlServer("Server=.;Database=idtest1;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True");
return new IdDbContext(builder.Options);
}
}
在程序包管理器控制台窗口,执行Add-Migration Init,用来初始化、然后执行更新脚本命令Update-database,用来生成数据库和表。
操作完成后,数据库会生成相关的表。
到此为止,框架的基础搭建就完成了,数据库表也生成好了,接下去就是编写代码对用户和角色进行操作。