前言

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 管理面板集成的更多相关文章

  1. asp.net core 2.0 webapi集成signalr

    asp.net core 2.0 webapi集成signalr   在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的: 这两天想着不能这么无私,最近.N ...

  2. ASP.NET Core会议管理平台实战_汇总贴

    ASP.NET Core会议管理平台实战 课程地址:https://ke.qq.com/course/389673?from=800004097#term_id=100464670 ASP.NET C ...

  3. asp.net core 系列之webapi集成Dapper的简单操作教程

    Dapper也是是一种ORM框架 这里记录下,使用ASP.NET 集成 Dapper 的过程,方便自己查看 至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关 在Sql S ...

  4. asp.net core IdentityServer4 概述

    概览 现代应用程序看上去大都是这样的: 最常见的交互是: 浏览器与Web应用程序通信 Web应用程序与Web API通信(有时是独立的,有时是代表用户的) 基于浏览器的应用程序与Web API通信 本 ...

  5. Asp.Net Core IdentityServer4 中的基本概念

    一.前言 这篇文章可能大家会觉得很空洞,没有实际的实战东西,主要是自己整理出来的IdentityServer4 的一些概念性的东西:如果你对IdentityServer4有过一定的实战经验,可以跳过不 ...

  6. asp.net core 系列之webapi集成EFCore的简单操作教程

    因为官网asp.net core webapi教程部分,给出的是使用内存中的数据即 UseInMemoryDatabase 的方式, 这里记录一下,使用SQL Server数据库的方式即 UseSql ...

  7. Asp.net Core IdentityServer4 入门教程(一):概念解析

    目录 1.IdentityServer4 是什么 2.什么是OpenID和OAuth 2.0协议 3.IdentityServer4 可以用来做什么 其他 1.IdentityServer4 是什么 ...

  8. ASP.NET Core CMS管理后台

    ASP.NET Core+LayUI+MySql CMS管理后台,主要功能包括 登录.修改密码,账号管理,菜单管理,角色权限管理等 由于工作之外,抽时间写的,用于学习交流,请慎重用于生产环境 项目概要 ...

  9. ASP.NET Core 包管理工具(4)

    之前忘记介绍ASP.NET Core静态文件wwwroot了.再来补充一下.步骤比较简单在项目上右击添加文件夹输入文件名称 wwwroot就搞定了.这个文件主要是放置一些静态文件的,比如css.js. ...

随机推荐

  1. HashMap,HashTable 区别,实现原理。

    HashMap是HashTable 的轻量级,非线程安全的,都是实现了map接口 区别:hashmap 允许空键值对的存在,非线程安全,效率高于hashtable,因为hashtable 是synch ...

  2. 再也不怕和老外交流了!我用python实现一个微信聊天翻译助手!

    前言 在前面的一篇文章如何用python“优雅的”调用有道翻译中咱们清楚的写过如何一层一层的解开有道翻译的面纱,并且笔者说过那只是脑洞的开始.现在笔者又回来了.当你遇到一些外国小哥哥小姐姐很心动.想结 ...

  3. 阿里开源服务发现组件 Nacos快速入门

    最近几年随着云计算和微服务不断的发展,各大云厂商也都看好了微服务解决方案这个市场,纷纷推出了自己针对微服务上云架构的解决方案,并且诞生了云原生,Cloud Native的概念. 云原生是一种专门针对云 ...

  4. 最大区间和变形 - codeforces

    题意 : 可以选择操作一串区间,将区间内的某一个数全部变成一个新的数字,询问整个区间中某个数字的出现次数总共有多少个? 思路分析 : 首先最后选的一定是一个区间,然后 ans = cnt(1, l-1 ...

  5. 牛客网上的ST阶跃表

    给你一个长为n的序列a和一个常数k 有m次询问,每次查询一个区间[l,r]内所有数最少分成多少个连续段,使得每段的和都 <= k 如果这一次查询无解,输出"Chtholly" ...

  6. poi解析excel(含有公式)

    /** * Jun 25, 2012 */ import java.io.File; import java.io.FileInputStream; import java.io.IOExceptio ...

  7. 手写vue中v-bind:style效果的自定义指令

    自定义指令 什么是自定义指令 以 v- 为前缀,然后加上自己定义好的名字组成的一个指令就是自定义指令.为什么要有自定义指令呢?在有些时候,你仍然需要对普通的DOM元素进行底层的操作,这个时候就可以用到 ...

  8. 《利用python进行数据分析》——Numpy基础

    一.创建数组 1.创建数组的函数 array:将输入数据(列表.元组.数组或其他序列类型)转换为ndarray,可用dtype指定数据类型. >>> import numpy as ...

  9. form get

    <form action=""> <input type="text" name="query" id="&qu ...

  10. Nginx-负载均衡实现解读

    负载均衡在服务端开发中算是一个比较重要的特性.因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就 ...