Identity提供基于用户和角色的membership管理框架,基本上可以满足业务项目登录操作的所有功能需求。
如果要使用这套框架需要新建User和Role类型分别继承自IUser<TKey>和IRole<TKey>,以后所有的操作都是以这两个类为基础的。
1.框架的设计思路是很简单的,新建了一系列的Store接口为实体类或者说数据库Table的直接操作接口,比如说如果我们实现了IUserPasswordStore<TUser, in TKey> ,那么所有对密码的直接操作方法都是定义在这个接口里面,IUserRoleStore<TUser, in TKey>接口定义了UserRole表的操作方法,我们可以很轻易的关联用户和角色。框架定义了很多这样的Store包含了UserClaims,Email,Lockout,PhoneNumber等等所有我们在用户管理操作中可能使用到的操作逻辑,并且有一个统一的UserStore实现类实现上面定义的所有Store接口。默认实现是定义了一个IdentityDbContext注入到UserStore的构造方法里面这样可以通过IdentityDbContext的IDbSet<TUser>和IDbSet<TRole>等等属性完成对数据库的操作。在实际生成环境中会自定义一个UserStore并注入到Ioc容器中,并且在该自定义UserStore的构造函数中依赖注入所有相关的IRepository这样就可以很好的使用领域分层中仓储层的设计了,我们也可以定义一些自己的Store接口比如说IUserPermissionStore来满足权限验证。
2.为了方便对User的操作,框架定义了一个UserManager类型,依赖上面所说的UserStore完成对用户的所有操作逻辑。比如增删改查User记录,修改密码,锁定账号,创建ClaimsIdentity
3.Identity本身的设计思路真的是很简单的,但是他的一些代码实现是很具有参考价值的我们可以应用到自己的框架或者业务项目中,比如我们在生成邮件验证Token的时候都是只有几分钟的有效期,这需要我们将时间信息也添加到Token中,验证的时候会带上时间的验证,Rfc6238AuthenticationService就很好的为我们提供了这样的实现,它的GenerateCode和ValidateCode设计更加的简洁实用。
很多的时候我们需要根据一个实例和一些特殊的条件来生成一个唯一标识的字符串,必要的时候还能获取获取到里面的各个具体的数据值,这个时候使用简单的序列化就很难满足要求了,框架中为我们提供了一个很好的实现
4.另外通读源码后了解到它的一些具体实现细节和扩展功能,可以使得我们更加放心大胆的使用来提高项目的逼格和效率了。
比如说我们根据登录成功后获取到的User记录来创建ClaimsIdentity使用的是UserManager下的IClaimsIdentityFactory<TUser, TKey>属性,我们可以自定义一个这样的Identity工厂类来完全自定义生成的ClaimsIdentity,同时默认的工厂实现会给生成的ClaimsIdentity添加UserId,UserName,Roles以及User相关的Claim。我们可以根据这个实现来获取自己所需要的数据,甚至重构自己的实现(不再使用缓存来保存Profile信息,使用IUserClaimStore保存到Claim表中,这样会自动带入到ClaimsIdentity中)
又或者Identity框架为我们实现了一个IdentityFactoryMiddleware可以很方便的在每次Request的生命周期内创建和Dispose一个对象,避免频繁的创建实例所带来的性能消耗
另外IdentityFactoryMiddleware还给我们提供了一个DataProtectionProvider参数方便我们在创建实例的过程中加密解密数据
(纯粹是为了下个月找工作而准备的一系列博文,每一篇都尽量精简,并非给初学者看的?)