.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
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信