.net core Identity之基于现有的实体(数据库模型) 或 自定义User和Role模型
                        
                     
                    
                    
                        一个系统组织架构是不可少的,所以 认证(authentication) 和 授权(authorization)是必不可少的,但是 微软很人性化的为我们提供了Identity这个东西,嗯,是好东西,但是总是稍微有那么一点不足,就是命名,以及部分字段可能用不到。没关系,我们可以自定义。
  1.第三方或官方提供的便捷方式?
    1.1.默认的IdentityUser,IdentityRole :
    
     生成方式没有什么好说的,创建项目时,修改下身份验证方式即可见到,如上面的表结构。这里涉及到 Claims identityClaims,如果还不知道是什么 看这里  应该是最简的总结了吧。这里很明显的,默认生成的表名称前缀是AspNet打头,,,根本不需要是不是。而且需要使用到 IdentityDbContext这个对象进行 迁移,那么如果我们的项目中已经自定义或者已有一个上下文对象,这两个是不是有些冲突?该用哪个呢?这里的 IdentityDbContext定义如下(Microsoft.AspNetCore.Identity.EntityFrameworkCore下定义的):
    
    1.2.ids4(identityServer4)生成的表如下:
    
    不得不说ids4很方便,但是有点多有点乱,不是我们想要的,所以怎么办呢?
     
   2.简要分析。
    按照我们以前用FX的时候的一贯逻辑,知道identity使用SignInManager,但是SignInManager使用到一个 UserManager对象,而这个UserManager使用到了 UserStore这个东西,好,这样的话我们就打开core.Indetity的源码再看看访问数据那里是如何定义的(因为我们一开始就说了,要自定义或者使用现有的模型)。
    
    很明显,思路也很明确,UserStore的实现,还是继承自 Identity.EntityFramework下的一个UserStore,继续跟进: 
   
    到这里就很直观了,Framework下面的这个UserStore实现了一系列的接口,在构造函数中注入了默认的上下问对象DbContext,呵呵,找就找到了根源了,那么我们就重新实现这个UserStore就可以了,将其中的数据上下文DbContext换成我们自己的就好了,我这么说没意见吧?
  
  3.重定义UserStore
    定义前我们要注意下,2中,泛型涉及到的 参数类型,我们都需要定义,可以直接使用core Identity中定义的,改下名称即可,我们自定义的UserStore名称我依旧定义成UserStore.cs:  (有点长。。。) 
 View Code
 
    这里我是通过uow获取的仓储对象,如果 看不明白,看这里 关于UOW模式 ,然后重定义其中的 增删删改查操作,,嗯,是的就是这么简单的。
    同样的 RoleStore我们也是需要自定义的,所以也看下一下源码的实现:
    
    看到了吧,这里就实现了两个接口,所以比UserStore实现要简单很多了,自定义实现如下(其中涉及的Role,RoleClaim依旧需要自定义,建议赋值 core identity中的):
 View Code
 
    这样我们就完成了 50% 的工作了,那么重点来了,怎么用起来?
services.AddScoped, UserStore>();
services.AddScoped, RoleStore>();
//services.AddScoped>();
//services.AddScoped>();
//services.AddScoped>();
如此注入到 IOC 容器就好啦,嗯,我本很开心的觉得这样就完事了,但是错误不断,也就是上面红色(注释掉)的三行,解决一个有提示另一个没有注入而无法正常使用,其实,少了一步骤,你可能会说是 Configures中 app.UseAuthentication() 是吧,其实不是的,呵呵:
configureSercvices中继续加入
IdentityBuilder builder = services.AddIdentity(
(options) =>
{
     options.SignIn.RequireConfirmedEmail = true;
  options.Password.RequireNonAlphanumeric = false;
  options.Password.RequireUppercase = false;
  options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(20);
}
);                       
builder.AddDefaultTokenProviders(); 
//关于 IdentityBuilder ,这里的两个类型User,Role,分别是我们自定义的 User实体和Role实体,此时我们再 app.UseAuthentication()  就可以了。
 
此时我们只需要在项目中如此注入即可:
 
 View Code
 
 
 
这里的泛型参数 分别是我们自定义的 User和Role的模型。
这时候我们使用已有的上下文进行迁移,将得到如下结果:
看我们自定义的结果:
    看我们的API的请求操作:
    (注册 并启用邮箱验证):
    
    这里使用自定义的个注册API模拟注册一个用户,然后模拟登录:
    
    
    嗯,结果很理想,需要验证。
    其他,可自定扩展。
 
下班,,,,
 
 
 https://www.cnblogs.com/Tmc-Blog/p/9958493.html