- ASP.NET Core 教程
- ASP.NET Core - 首页
- ASP.NET Core - 概述
- ASP.NET Core - 环境设置
- ASP.NET Core - 新建项目
- ASP.NET Core - 项目布局
- ASP.NET Core - project.json
- ASP.NET Core - 配置
- ASP.NET Core - 中间件
- ASP.NET Core - 异常处理
- ASP.NET Core - 静态文件
- ASP.NET Core - 设置 MVC
- ASP.NET Core - MVC 设计模式
- ASP.NET Core - 路由
- ASP.NET Core - 属性路由
- ASP.NET Core - 操作结果
- ASP.NET Core - 视图
- 设置 Entity Framework
- ASP.NET Core - DbContext
- ASP.NET Core - Razor 布局视图
- ASP.NET Core - Razor 视图启动
- ASP.NET Core - Razor 视图导入
- ASP.NET Core - Razor 标签助手
- ASP.NET Core - Razor 编辑表单
- ASP.NET Core - 身份验证概述
- ASP.NET Core - Authorize 属性
- 身份验证配置
- ASP.NET Core - 身份验证迁移
- ASP.NET Core - 用户注册
- ASP.NET Core - 创建用户
- ASP.NET Core - 登录和注销
- ASP.NET Core 有用资源
- ASP.NET Core - 快速指南
- ASP.NET Core - 有用资源
- ASP.NET Core - 讨论
ASP.NET Core - 身份验证配置
本章将介绍如何安装和配置身份验证框架,这只需要少量的工作。如果您使用 Visual Studio 创建一个新的 ASP.NET Core 应用程序,并选择带有设置为单个用户帐户的身份验证的完整 Web 应用程序模板,则该新项目将包含为您设置的所有身份验证框架组件。
我们从一个空项目开始。我们现在将从头开始设置身份验证框架,这是一种了解完整应用程序模板中所有组件的好方法,因为如果您没有详细地研究过所有代码,可能会令人困惑。
首先,我们需要安装依赖项,即 **Microsoft.AspNet.Identity**。我们将继续安装 **Microsoft.AspNet.Identity.EntityFramework**,然后实现与 Entity Framework 协同工作的身份验证框架。
如果我们依赖 Identity.EntityFramework,则该包包含 Identity 包。
如果您构建自己的数据存储,则可以使用 Identity 包。
安装依赖项后,我们可以创建一个自定义 User 类,其中包含我们想要存储的有关用户的所有信息。
对于此应用程序,我们将继承身份验证框架提供的类,该类将为我们提供所有必需项,例如 Username 属性和存储哈希密码的位置。
我们还需要修改我们的 **FirstAppDemoDbContext** 类以继承自身份验证框架的 **IdentityDbContext** 类。
IdentityDbContext 为我们提供了使用 Entity Framework 存储用户信息所需的一切。一旦我们设置了 User 类和 **DbContext**,我们就需要使用 Startup 类的 **ConfigureServices** 方法将身份验证服务配置到应用程序中。
就像我们需要添加服务来支持 MVC 框架一样,身份验证框架也需要将服务添加到应用程序才能工作。
这些服务包括 **UserStore** 服务和 **SignInManager** 服务。
我们将把这些服务注入到我们的控制器中,以便在适当的时间创建用户并发出 Cookie。
最后,在启动的 Configure 方法期间,我们需要添加身份验证中间件。
此中间件不仅有助于将 Cookie 转换为用户身份,而且还可以确保用户不会看到带有 401 响应的空页面。
现在让我们按照以下步骤操作。
**步骤 1** - 我们需要通过添加对身份验证框架的依赖项来继续。让我们将 Microsoft.AspNet.Identity.EntityFramework 依赖项添加到 project.json 文件中。这将包含我们需要的其他所有必要的身份验证包。
{ "version": "1.0.0-*", "compilationOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.AspNet.Mvc": "6.0.0-rc1-final", "Microsoft.AspNet.Diagnostics": "1.0.0-rc1-final", "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final", "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final", "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final", "EntityFramework.Commands": "7.0.0-rc1-final", "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final", "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final" }, "commands": { "web": "Microsoft.AspNet.Server.Kestrel", "ef": "EntityFramework.Commands" }, "frameworks": { "dnx451": { }, "dnxcore50": { } }, "exclude": [ "wwwroot", "node_modules" ], "publishExclude": [ "**.user", "**.vspscc" ] }
**步骤 2** - 保存此文件。Visual Studio 将恢复包,现在我们可以添加我们的 User 类了。让我们通过右键单击 Models 文件夹并选择添加→类来添加 User 类。
将此类命名为 User 并单击添加按钮,如上图所示。在此类中,您可以添加属性以保存您想要存储的有关用户的任何信息。
**步骤 3** - 让我们从身份验证框架提供的类派生 User 类。它是 Identity.EntityFramework 命名空间中的 IdentityUser 类。
using Microsoft.AspNet.Identity.EntityFramework; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FirstAppDemo.Models { public class User : IdentityUser { } }
**步骤 4** - 让我们现在转到 IdentityUser,将光标放在该符号上,然后按 F12 以查看 Visual Studio 的元数据视图。
#region Assembly Microsoft.AspNet.Identity.EntityFramework, Version = 3.0.0.0, namespace Microsoft.AspNet.Identity.EntityFramework { public class IdentityUser : IdentityUser<string> { public IdentityUser(); public IdentityUser(string userName); } }
**步骤 5** - 您可以看到 IdentityUser 是从字符串的 IdentityUser 派生的。您可以通过从 IdentityUser 派生并指定我们的泛型类型参数来更改主键的类型。您还可以使用理想情况下为整数值的主键存储内容。
**步骤 6** - 让我们现在将光标放在字符串的 IdentityUser 上,然后再次按 F12 以转到元数据视图。
您现在可以查看默认情况下与用户相关的所有信息。这些信息包括:
我们在此应用程序中不会使用的字段,但可以使用。
身份验证框架可以跟踪特定用户的失败登录尝试次数,并在一段时间后锁定该帐户。
存储 PasswordHash、PhoneNumber 的字段。我们将使用的两个重要字段是 PasswordHash 和 UserName。
我们还将隐式使用用户的 primary key 和 ID 属性。如果您需要查询特定用户,也可以使用该属性。
**步骤 7** - 现在,我们需要确保 User 包含在我们的 DbContext 中。因此,让我们打开应用程序中拥有的 **FirstAppDemoDBContext**,并且不直接从 DBContext(内置的 Entity Framework 基类)派生它,现在我们需要从 IdentityDbContext 派生它。
using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Data.Entity; namespace FirstAppDemo.Models { public class FirstAppDemoDbContext : IdentityDbContext<User> { public DbSet<Employee> Employees { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Data Source = (localdb)\\MSSQLLocalDB; Initial Catalog = FirstAppDemo;Integrated Security = True; Connect Timeout = 30;Encrypt = False;TrustServerCertificate = True; ApplicationIntent = ReadWrite;MultiSubnetFailover = False"); } } }
**步骤 8** - IdentityDbContext 类也在 Microsoft.AspNet.Identity.EntityFramework 命名空间中,我们可以指定它应该存储的用户类型。这样,我们添加到 User 类的任何其他字段都会进入数据库。
IdentityDbContext 带来了额外的 DbSet,不仅用于存储用户,还用于存储有关用户角色和用户声明的信息。
我们的 User 类现在已准备就绪。我们的 FirstAppDemoDbContext 类已配置为与身份验证框架协同工作。
我们现在可以进入 Configure 和 ConfigureServices 来设置身份验证框架。
**步骤 9** - 让我们现在从 **ConfigureServices** 开始。除了我们的 MVC 服务和我们的 Entity Framework 服务外,我们还需要添加我们的身份验证服务。这将添加身份验证框架依赖于执行其工作的所有服务。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddEntityFramework() .AddSqlServer() .AddDbContext<FirstAppDemoDbContext> (option => option.UseSqlServer(Configuration["database:connection"])); services.AddIdentity<User, IdentityRole>() .AddEntityFrameworkStores<FirstAppDemoDbContext>(); }
AddIdentity 方法采用两个泛型类型参数——用户实体的类型和角色实体的类型。
这两个泛型类型参数是我们用户的类型——我们刚刚创建的 User 类和我们想要使用的 Role 类。我们现在将使用内置的 IdentityRole。此类位于 EntityFramework 命名空间中。
当我们将 Entity Framework 与 Identity 一起使用时,我们还需要调用第二个方法——AddEntityFrameworkStores。
AddEntityFrameworkStores 方法将配置诸如 UserStore 之类的服务,该服务用于创建用户并验证其密码。
**步骤 10** - 下面的两行是我们配置应用程序服务的全部内容。
services.AddIdentity<User, IdentityRole>() .AddEntityFrameworkStores<FirstAppDemoDbContext>();
**步骤 11** - 我们还需要添加中间件。我们插入中间件的位置很重要,因为如果我们过晚插入中间件,它将永远没有机会处理请求。
如果我们需要在我们的 MVC 控制器中进行授权检查,我们需要在 MVC 框架之前插入身份验证中间件,以确保成功处理 Cookie 和 401 错误。
public void Configure(IApplicationBuilder app) { app.UseIISPlatformHandler(); app.UseDeveloperExceptionPage(); app.UseRuntimeInfoPage(); app.UseFileServer(); app.UseIdentity(); app.UseMvc(ConfigureRoute); app.Run(async (context) => { var msg = Configuration["message"]; await context.Response.WriteAsync(msg); }); }
**步骤 12** - 我们插入中间件的位置就是我们将添加身份验证中间件的位置。以下是 Startup.cs 文件的完整实现。
using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using FirstAppDemo.Services; using Microsoft.AspNet.Routing; using System; using FirstAppDemo.Entities; using Microsoft.Data.Entity; using FirstAppDemo.Models; using Microsoft.AspNet.Identity.EntityFramework; namespace FirstAppDemo { public class Startup { public Startup() { var builder = new ConfigurationBuilder() .AddJsonFile("AppSettings.json"); Configuration = builder.Build(); } public IConfiguration Configuration { get; set; } // This method gets called by the runtime. // Use this method to add services to the container. // For more information on how to configure your application, // visit http://go.microsoft.com/fwlink/?LinkID = 398940 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddEntityFramework() .AddSqlServer() .AddDbContext<FirstAppDemoDbContext>(option => option.UseSqlServer(Configuration["database:connection"])); services.AddIdentity<User, IdentityRole>() .AddEntityFrameworkStores<FirstAppDemoDbContext>(); } // This method gets called by the runtime. // Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app) { app.UseIISPlatformHandler(); app.UseDeveloperExceptionPage(); app.UseRuntimeInfoPage(); app.UseFileServer(); app.UseIdentity(); app.UseMvc(ConfigureRoute); app.Run(async (context) => { var msg = Configuration["message"]; await context.Response.WriteAsync(msg); }); } private void ConfigureRoute(IRouteBuilder routeBuilder) { //Home/Index routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"); } // Entry point for the application. public static void Main(string[] args) => WebApplication.Run<Startup>(args); } }
**步骤 13** - 让我们现在继续构建应用程序。在下一章中,我们需要添加另一个 Entity Framework 迁移,以确保我们的 SQL Server 数据库中包含身份验证模式。