首页 > 技术文章 > IdentityServer4内存模式改造成Db查询

Qintai 2021-03-02 20:09 原文

这篇文章主要介绍 identity server4  3.x的版本,目前最新已经是4.x版本,其实完全可以用 identityserver4的EF版本数据源基于DB,以下是基于 identityserver基于内存版,用户模块改写成查询 DB,外部客户端和scheme 的配置任然是使用json写死的,阅读identityserver源码,了解到如何扩展 关于用户登录的配置

 

准备工作:identity server4的安装模板先安装好,控制台命令行 创建一个基于内存模式的identity server4 项目

输入dotnet new

 

 

 

 

 

再输入:dotnet new is4inmem。出现“The template "IdentityServer4 with In-Memory Stores and Test Users" was created successfully.” 证明创建好了

 

 

 

 

 

 

一:打开项目找到登录方法  

 

 

 

 

 

 

 

 

 

我们只需要 TestUserStoe 这个类换成我们自己的

 

二:换掉 TestUserStoe

2.1 新建一个interface IUserInfoervice,在新建实现类:UserInfoervice

再次打开 TestUserStore 这个类,反编译可以可以到里面的方法,我们 UserInfoervice    也需要实现那4个方法,换成我们自己的用户逻辑

 

 

 

 

2.2注入到IOC容器中:

 

Services.AddTransient<IUserInfoervice, UserInfoervice>();

 

2.3 重写 ids4 测试用户的服务

 

 

打开他的源码,AddTestUse方法r的源码,可以看到 这个只是包了一层

 

 

 

 

我们要做的就是全部切换成我们自己逻辑,  替换掉 :TestUserProfileService,替换掉 TestUserResourceOwnerPasswordValidator,这个主要是针对 密码授权模式的,也替换掉

 

 //这句话 可以直接注释掉了,因为我们 UserInfoervice 已经注册IOC了
//   builder.Services.AddSingleton(new TestUserStore(users));

TestUserProfileService源码,新建立 CustomProfileService这个类继承 IProfileService 实现 方法

 

 

 

 

TestUserResourceOwnerPasswordValidator 新建立

CustomUserResourceOwnerPasswordValidator  这个类继承 IResourceOwnerPasswordValidator实现 方法

 

 

 

 

 

最后在IOC中替换:

 

 

 

 

 

三:控制器中 把 TestUserStore 替换成  UserInfoervice

 

 

 

 

 

 

到此,就已经切换成功了

 

四 关注点 3个方法,可以换成自己的登录逻辑

 

FindBySubjectId     // 根据SubjectId查找用户

ValidateCredentials //根据用户名和密码,验证

FindByUsername      //根据查找用户名进行查找

 

UserInfoervice可以先把 TestUserstoke 里面的实现方法拷贝过来,再换成数据库查询方式就可以了

推荐阅读