Asp.Net Core IdentityServer4 管理面板集成
前言
IdentityServer4(以下简称 Id4) 是 Asp.Net Core 中一个非常流行的 OpenId Connect 和 OAuth 2.0 框架,可以轻松集成到 Asp.Net Core 应用中,并且与 Asp.Net Core Identity 也可以轻松集成。博客园也有大佬发布了很多关于 Id4 的相关文章。比如晓晨Master的系列入门教程:IdentityServer4 中文文档与实战,我也是看他的教程学习入门的,教程基于 .Net Core 2.x,但是影响不大。
但是这个教程还有一个遗憾,没有关于如何管理 Id4 数据的部分,而 Id4 本身的数据模型还是有点小复杂的,直接去改数据库心里发慌,也不是长久之计。Id4 作为开源框架也为商业化留了一手,就是关于 Id4 的管理,需要付费才能获得 Id4 团队准备的管理模块。幸好万能的 Github 上有大神开源了自制的管理模块。其中最著名的应该就是 Skoruba.IdentityServer4.Admin 了。这个管理模块包含了一些基本包、3个可执行项目(主身份服务器,网页版管理器和 Web Api 版管理器)和一个 VS 解决方案模板。从零开始搭建项目没什么问题,但如果已经有一个包含 Id4 的项目的情况下要怎么办呢?问题就在于要如何把解决方案模板中的管理器项目移花接木到自己的主项目中,在一些情况下,甚至可能需要把管理器直接集成到现有项目。经过一段时间的研究,终于把这个问题搞定了,在此也分享给各位园友。
正文
集成改造过程中,我下载了管理项目源码、创建了模板解决方案用作参考,也 copy 了部分代码到我的主项目中,如果各位需要在我的演示基础上继续改造,也可以提前准备这些代码参考。同时由于原始项目对 AutoMapper 的使用方式与 DI 集成的使用方式冲突,我没有使用内置服务实现,使用了我改造后的服务实现。
接下来简述一下我的改造步骤,由于改造项目持续时间较长,可能有疏漏。可以到文章末尾下载我的项目实际运行体验。
1、在 Startup.ConfigureServices 中注册 AutoMapper,因为我的配置文件分散在不同项目中,写法比较特殊;改造 Id4 的 AutoMapper 相关代码:
AutoMapper.IConfigurationProvider config = new MapperConfiguration(cfg =>
{
var profileTypes =
from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.IsSubclassOf(typeof(Profile)) && !type.IsGenericType && !type.IsAbstract
select type; var profiles = profileTypes.Select(x =>
{
try
{
return (Profile)Activator.CreateInstance(x);
}
catch (MissingMethodException ex)
{
return null;
}
catch(Exception ex)
{
throw ex;
}
}).Where(x => x != null);
cfg.AddProfiles(profiles);
});
services.AddSingleton(config);
services.AddScoped<IMapper, Mapper>();
Startup.ConfigureServices
2、Id4 Mappers 的改造思路是去掉内置的 IMapper 实例,让管理服务把注入的 Imapper 作为参数传递给辅助方法。这里以其中一个为例,其他类似的都这么操作。把管理服务中的各种 ToModel() 和 ToEntity() 改成 ToModel(mapper) 和 ToEntity(mapper),别忘了在服务中注入 IMapper,从源码中拷贝服务源码并修改。
public static class PersistedGrantMappers
{
//static PersistedGrantMappers()
//{
// Mapper = new MapperConfiguration(cfg => cfg.AddProfile<PersistedGrantMapperProfile>())
// .CreateMapper();
//} //internal static IMapper Mapper { get; } public static PersistedGrantsDto ToModel(this PagedList<PersistedGrantDataView> grant, IMapper mapper)
{
return grant == null ? null : mapper.Map<PersistedGrantsDto>(grant);
} public static PersistedGrantsDto ToModel(this PagedList<PersistedGrant> grant, IMapper mapper)
{
return grant == null ? null : mapper.Map<PersistedGrantsDto>(grant);
} public static PersistedGrantDto ToModel(this PersistedGrant grant, IMapper mapper)
{
return grant == null ? null : mapper.Map<PersistedGrantDto>(grant);
}
}
3、对比模板项目代码和自己项目代码进行融合,比如复制控制器、视图、js脚本、css样式、resx资源等各种新增文件,修改 Startup 注册 Id4 管理的各种代码,引入 TagHelper 等修改文件。这个部分就是需要耐心和细心,没什么技术含量。注意把注册服务的代码改成注册改造后的服务实现。根据需要改造视图等等。代码比较分散,就不贴了,有兴趣的朋友去我的项目中看吧。
效果预览:
地址为:https://localhost:5001/IdentityServer/ConfigHome


Swagger UI 地址为:https://localhost:5001/swagger/index.html。可以通过点击 Authorize 按钮登录管理账号,完全可视化操作,没有任何难度门槛。注意上面的说明,为不同的登录账号选择对应的 scopes,不然 Id4 会返回授权请求错误。一个 client 请求授权的各种资源和权限必须在 Id4 中提前登记备案,请求的权限和登记备案过的权限不一致会被驳回授权请求。
注意事项:
1、Id4 管理模板使用了 resx 管理多语言翻译,和我项目使用的方案不兼容,为此我专门改造了 Asp.Net Core 本地化服务,详情见我的博客:Asp.Net Core 混合全球化与本地化支持。
2、项目中保留了2个融合改造后的独立网页管理项目和 Web Api 管理项目,所以本示例一共包含4个管理入口,分别是集成在主项目中的网页和 Api 端口、独立的网页和 Api 端口。
3、初始账号中所有入口都只有 admin 有权访问 Id4 管理端口,端口已经由 Id4 的初始设置进行保护。所有账号的初始密码为:Pass123$。
结语
完成改造后,才算是完整集成了 Id4 这个框架,永远用教程代码里写死的那些 Client 终归不是长久之计。
转载请完整保留以下内容并在显眼位置标注,未经授权删除以下内容进行转载盗用的,保留追究法律责任的权利!
本文地址:https://www.cnblogs.com/coredx/p/12318135.html
完整源代码:Github
里面有各种小东西,这只是其中之一,不嫌弃的话可以Star一下。
Asp.Net Core IdentityServer4 管理面板集成的更多相关文章
- asp.net core 2.0 webapi集成signalr
asp.net core 2.0 webapi集成signalr 在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的: 这两天想着不能这么无私,最近.N ...
- ASP.NET Core会议管理平台实战_汇总贴
ASP.NET Core会议管理平台实战 课程地址:https://ke.qq.com/course/389673?from=800004097#term_id=100464670 ASP.NET C ...
- asp.net core 系列之webapi集成Dapper的简单操作教程
Dapper也是是一种ORM框架 这里记录下,使用ASP.NET 集成 Dapper 的过程,方便自己查看 至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关 在Sql S ...
- asp.net core IdentityServer4 概述
概览 现代应用程序看上去大都是这样的: 最常见的交互是: 浏览器与Web应用程序通信 Web应用程序与Web API通信(有时是独立的,有时是代表用户的) 基于浏览器的应用程序与Web API通信 本 ...
- Asp.Net Core IdentityServer4 中的基本概念
一.前言 这篇文章可能大家会觉得很空洞,没有实际的实战东西,主要是自己整理出来的IdentityServer4 的一些概念性的东西:如果你对IdentityServer4有过一定的实战经验,可以跳过不 ...
- asp.net core 系列之webapi集成EFCore的简单操作教程
因为官网asp.net core webapi教程部分,给出的是使用内存中的数据即 UseInMemoryDatabase 的方式, 这里记录一下,使用SQL Server数据库的方式即 UseSql ...
- Asp.net Core IdentityServer4 入门教程(一):概念解析
目录 1.IdentityServer4 是什么 2.什么是OpenID和OAuth 2.0协议 3.IdentityServer4 可以用来做什么 其他 1.IdentityServer4 是什么 ...
- ASP.NET Core CMS管理后台
ASP.NET Core+LayUI+MySql CMS管理后台,主要功能包括 登录.修改密码,账号管理,菜单管理,角色权限管理等 由于工作之外,抽时间写的,用于学习交流,请慎重用于生产环境 项目概要 ...
- ASP.NET Core 包管理工具(4)
之前忘记介绍ASP.NET Core静态文件wwwroot了.再来补充一下.步骤比较简单在项目上右击添加文件夹输入文件名称 wwwroot就搞定了.这个文件主要是放置一些静态文件的,比如css.js. ...
随机推荐
- 开源API网关,你选对了么?
开源API网关,你选对了么? api网关的本质 不用扯那么多,也不用画图,一句话说清楚 api网关:流量总入口,得以集中控制! 就这么简单 api网关协议上最基本要支持HTTP 和 WebSocket ...
- js绑定下拉框数据源
··· buildRule:function (ruleId) { var ruleList = internal.ruleList; if(ruleList){ var programme_sel= ...
- asp.net core系列 74 Exceptionless服务端安装
一. Docker安装 Docker 要求版本Docker 18.09.0+以上 安装地址:https://www.runoob.com/docker/windows-docker-insta ...
- Netty快速入门(01)Linux I/O模型介绍
Netty简述 Netty是一个高性能的网络编程框架. 上面提到了几个关键的字眼,高性能,网络编程,框架.这些概括Netty的本质. Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议服务 ...
- Java集合框架(java.util包)
集合的概念: 是一种工具类,可以存储任意数量.任意类型的对象(所以后面需要用到泛型,以约束集合中元素的类型) 集合的作用: 1.在类的内部对属性进行组织 2.方便快速定位属性位置 3.某些集合接口,提 ...
- extract函数的使用
EXTRACT(field FROM source) extract函数从日期/时间数值里抽取子域,比如年.小时等. source必须是一个timestamp, time, interval类型的值表 ...
- Spring Boot2 系列教程 (六) | 使用 JdbcTemplates 访问 Mysql
前言 如题,今天介绍 springboot 通过jdbc访问关系型mysql,通过 spring 的 JdbcTemplate 去访问. 准备工作 SpringBoot 2.x jdk 1.8 mav ...
- 死磕面试 - Dubbo基础知识37问(必须掌握)
作为一个JAVA工程师,出去项目拿20k薪资以上,dubbo绝对是面试必问的,即使你对dubbo在项目架构上的作用不了解,但dubbo的基础知识也必须掌握. 整理分享一些面试中常会被问到的dubbo基 ...
- Qt Installer Framework翻译(5-3)
推广更新 创建在线安装程序,以便能够向安装产品的用户推广更新. 为了推广更新,需要执行以下步骤: 将待更新内容复制到package文件夹. 在package.xml文件中增加待更新组件的元素的值. 使 ...
- set集合迭代
1.迭代遍历 Set<String> set = new HashSet<String>(); Iterator<String> it = set.iterator ...