标识(Identity)框架入门(内含两个实战案例)

一、知识来源

Part5-1:ASP.NET Core标识框架1
Part5-2:ASP.NET Core标识框架2

二、Authentication与Authorization

1、Authentication与Authorization:网站登录权限验证相关两个概念

  • Authentication:登录控制。
  • Authorization:登录进去后对具体操作权限控制。

2、对于能访问同一个系统的一批人,如何对他们做不同粒度的权限控制呢?

  • 使用“角色”去完成。
  • 登录控制是用用户:张三、李四、王五都是公司员工,他们可以访问公司专属系统
  • 张三是员工能访问模块A权限,李四经理能访问模块A、B权限,王五老板能访问模块A、B、C权限。这里的员工、经理、老板就是角色。
  • 一个角色下面包含多个用户。


三、Identity框架介绍

1、RBAC策略:基于角色的访问控制。

2、标识框架Identity:帮助程序员把创建用户表、角色表,建立角色和用户表的关系,简化用户角色数据处理等等一系列操作。

  • 强烈推荐Identity
  • Identity通过EF Core操作数据库。


四、Identity框架使用


1、安装包

  • NuGet\Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore -Version 6.0.16

2、创建用户角色相关的实体类。

  • Identity框架已经帮助我们提供了两个实体类:IdentityUser<TKey>、IdentityRole<TKey>
  • 泛型中的<Tkey>代表主键类型,可以使用自增整数类型、GUID类型。
  • 一般情况下编写继承自IdentityUser<TKey>、IdentityRole<TKey> 的类,主要是增加一些自定义的属性。
using Microsoft.AspNetCore.Identity;

namespace _01IdentityIntroductory
{
    public class MyRole: IdentityRole<long>
    {
    }
}

using Microsoft.AspNetCore.Identity;

namespace _01IdentityIntroductory
{
    public class MyUser:IdentityUser<long>
    {
    }
}

3、创建继承IdentityDbContext的类

  • 内置了对IdentityUser<TKey>、IdentityRole<TKey> 的处理
  • 提供了基本的增删改查操作。
  • 注意IdentityDbContext一定要指定后面的<MyUser, MyRole, long>泛型

namespace _01IdentityIntroductory
{
    public class MyDbContext:IdentityDbContext<MyUser, MyRole, long>
    {
        public MyDbContext(DbContextOptions options): base(options)
        {
        }
    }
}

4、向依赖注入容器中注册标识框架相关的服务

  • 下图中的配置代码很多,其实大部分是对密码强度做配置的。
  • IdentityK框架提供的默认密码策略比较安全,但是用起来很麻烦,比如密码一定要多少位、大小写字母、特殊符号。
  • 这里的演示会对密码策略进行简化,所以不需要那么多配置代码。


5、注册Identity相关服务代码

  • AddIdentityCore与AddIdentity:注册与Identity框架相关的一些服务。
  • AddIdentity:用来添加所有与身份验证相关的默认设置和组件(包括用户管理、密码策略、令牌服务等),通过该方法只需少量的配置即可启用身份验证。
  • AddIdentityCore:轻量级的方式来添加身份验证支持。该方法只为框架提供最基本的身份特性,如 ClaimsIdentity 和 AuthenticationType 等,可自定义一些身份验证处理程序和服务,以满足特定的业务需求。这种方式非常适合那些需要对身份验证进行高度个性化定制的应用场景,例如 OAuth2 认证等。

6、迁移数据库,查看生成的表


  • User表


  • Roles表


7、对User表新增一个微信账号的字段,通过EFCore操作。





杨中科老师笔记

8、通过RoleManager、UserManager等来进行数据操作。

  • 一般情况下没必要直接使用MyDbContext来操控实体完成增删改查
  • 因为:Identity提供封了装好的方式帮助我们简便的操作实体,即RoleManager、UserManager等
  • 创建角色
  • 创建用户
  • 通过RoleManager的方法可以实现很多对角色的增删改查,不需要手动去调用DbContext的Role或User实体。
查看RoleManager的方法

9、RoleManager、UserManager案例实战之:创建角色、创建用户、关联用户和角色

  • RoleManager中很多方法的返回值是Task<IdentityResult>,那么这些方法一旦调用失败不会抛异常,而是返回IdentityResult里面的Succeeded属性为False
  • Succeeded为Fasle,此时IdentityResult的IEnumerable<IdentityError> Errors属性包含所有错误的详细,因为错误信息不止一条,所有Errors属性是IEnumerable<T>类型
  • 基于以上两条特性,我们调用返回值为Task<IdentityResult>类型的方法的时候,最好判断一下返回值是True还是False。

  • 代码


  • 调用Action方法


  • 查看数据表新增数据


10、RoleManager、UserManager案例实战之:检查登录信息

  • IsLockedOutAsync(TUser user):判断用户账号有没有被锁定,比如密码错误过多导致短时间锁定。
  • CheckPasswordAsync(TUser user, string password):检查用户的密码是否正确。
  • AccessFailedAsync:增加 Identity 用户的登录失败次数,在帐户锁定次数达到最大失败尝试次数时对该用户进行锁定。在AspNetUsers表中可以查询到锁定相关的字段信息。但是登录成功后在代码中要使用ResetAccessFailedCountAsync对AccessFailedAsync的值进行复位为0。
  • 拓展:对于生产环境和开发环境返回不同的报错信息,有助于保证生产环境的安全性和开发环境的Debug方便性,详见部门代码及其注释部分讲解。

  • 代码


  • 调用_测试密码错误:观察AccessFailedAsync的变、多试几次调用失败观察锁定时间

  • 调用_测试密码正确:如果调用前AccessFailedAsync不为0,密码正确后观察AccessFailedAsync的变化。

  • 调用_测试用户不存在

11、关于锁定相关的配置

  • 登录错误多少次才锁定

  • 锁定时间默认多长

  • 可以在Program.cs中配置


  • SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd)可以手动更改锁定时长。那么就可以根据失败次数逐渐递增,进行阶梯式的设定延长锁定时间。

12、其它的一些方法可以自行看文档。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容