在本文中,将创建一个项目并设置数据库以使用ASP.NET Core Identity。将从一个空项目开始,逐步构建项目上的特性。
将从ASP.NET Core 2.0和Visual Studio 15.4.3开始,创建一个空的ASP.NET Core 2.0 Web项目。将从零开始,以便能够确切地理解ASP.NET Core Identity的工作原理。
空项目没有太多内容。关于它,需要知道的关键事情有:
Program.cs - 此文件中的代码基本上定义了Web服务器和启动类。
Startup.cs - 在此类中定义请求处理管道并配置服务。
在ConfigureServices方法中,配置应用程序中使用的服务,如Entity Framework、Identity等。
public void ConfigureServices(IServiceCollection services)
{
}
在Configure方法中,使用中间件配置请求处理管道。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
随着逐步完成本文,将对这两个方法进行修改。
ASP.NET Core 2.0的另一个有趣之处在于它有一个.csproj文件,而不是project.json文件。可以通过在解决方案资源管理器中右键单击项目节点并选择“编辑 (ProjectName).csproj”来打开.csproj文件。
如果打开.csproj文件,将发现Microsoft.AspNetCore.All元包在这里被引用。所有ASP.NET Core 2.x和Entity Framework Core 2.x所需的NuGet包都包含在Microsoft.AspNetCore.All包中。
Microsoft.AspNetCore.Identity命名空间定义了以下用户管理模型:
可以直接在应用程序中使用这些类(在大多数情况下,会这样做)。但也可以定义自己的类并继承它们。让扩展IdentityUser类并为此模型添加FirstName和LastName。
为此,让向解决方案中添加一个名为Models的文件夹。添加一个名为ApplicationUser的类,该类继承自IdentityUser。
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
在开始下一步之前,将向解决方案中添加一个appsettings.json文件。默认情况下,它应该添加一个连接字符串,如下所示:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=_CHANGE_ME;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
让将数据库名称从_CHANGE_ME更改为IdentityDemo或其他更有意义的名称。
ASP.NET Core Identity附带了Entity Framework Core Identity包,该包具有将用户信息存储在SQL Server数据库中的EF核心实现。
Microsoft.AspNetCore.Identity.EntityFrameworkCore命名空间实现了IdentityDbContext<TUser>,它继承自DbContext。这个类为所有身份模型提供了现成的DbSet。
因此,可以创建ApplicationDbContext,它继承自IdentityDbContext<ApplicationUser>。
让向解决方案中添加一个名为Data的文件夹,并将ApplicationDbContext类添加到此文件夹中。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
在前面的步骤中,似乎没有在ApplicationDbContext类中使用任何连接字符串。相反,使用依赖注入注入了DbContextOptions。记住必须在Startup类的ConfigureServices方法中配置这个。
必须做的另一件重要事情是配置与ASP.NET Core Identity相关的服务,以便进行依赖注入。最终的ConfigureServices方法将如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString(
"DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
最后,必须将身份添加到请求管道中。为此,必须在Configure方法的末尾添加以下行。
app.UseAuthentication();
这行代码将身份验证中间件添加到请求管道中。
要使用EF Core创建数据库,需要迁移。为此,请安装以下包:
Install-package Microsoft.EntityFrameworkCore.Tools
确保.csproj文件如下所示:
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" />
</ItemGroup>
现在要创建一个名为initial的迁移,请在.csproj文件所在的文件夹中运行以下命令。
dotnet ef migrations add Initial
现在,运行以下命令以创建数据库:
dotnet ef database update