AspNet Core中的标识Identity,是用于Web应用程序的成员身份验证系统。
最方便的引入办法是在创建MVC或Pages的Web应用时,直接选择相应的身份验证系统。
如图:
如果选择的是“个人用户帐户”,则系统将包含7个实体类型,分别为User(用户)、Role(角色)、UserClaim(用户权限声明)、UserToken(用户身份验证令牌)、RoleClaim(角色内所有用户授予权限声明)、UserLogin(用户与登录名关联)、UserRole(用户与角色关联)。如何缺省的话,会对应创建如下7张数据表:
如果希望用户身份验证系统与自己使用的数据表结合在同一数据库,则只需要你的数据上下文定义类继承自IdentityDbContext(包含角色)即可。如
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { } public DbSet<Product> Products { get; set; } ... }
其中ApplicationUser是继承自IdentityUser的自定义用户类,该类可以添加一些自己的用户属性。如ClientIP、CreateDate等。如果不需要引入这些额外属性,可以直接使用IdentityUser作为基类泛型。
OnModelCreating方法可以自定义数据表字段属性。如字长、表名等。
这样,最后生成的数据库就可以直接包含你自己的表和身份验证所需的7张表了,用起来比较方便。
对于MVC Web应用,使用身份验证系统是挺简单的。通过在Startup.cs文件进入依赖项注入:
(1)在ConfigureSerivces方法中添加:
services.AddDbContext<ApplicationDbContext>(options => options.UseMySql( Configuration.GetConnectionString("MysqlConnection")));
实现数据库的访问。
(2)在同一方法中添加
services.AddDefaultIdentity<ApplicationUser>() .AddRoles<IdentityRole>() .AddRoleManager<RoleManager<IdentityRole>>() .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders();
注入用户验证服务。
(3)在Configure方法中添加
app.UseAuthentication();
添加授权服务。
(4)在控制器中引入如下命名空间(如果缺少对应的包,就通过NuGet安装):
using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; using Microsoft.EntityFrameworkCore; using Microsoft.AspNetCore.Authorization;
(5)使用相应的管理服务
public class ProductController : Controller { private readonly UserManager<ApplicationUser> _userManager; // 用户管理 private readonly RoleManager<IdentityRole> _roleManager; // 角色管理 private readonly SignInManager<ApplicationUser> _signInManager; // 登录管理 public ProductController(UserManager<Application> userManager, RoleManager<IdentityRole>, SignInManager<Applicationuser> signInManager) { _userManager = userManager; _roleManager = roleManager; _signInManager = signInManager; } ... }
此后,就可以使用上述字段变量调用相应的功能进行用户管理了。