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 相关代码:

      2、Id4 Mappers 的改造思路是去掉内置的 IMapper 实例,让管理服务把注入的 Imapper 作为参数传递给辅助方法。这里以其中一个为例,其他类似的都这么操作。把管理服务中的各种 ToModel() 和 ToEntity() 改成 ToModel(mapper) 和 ToEntity(mapper),别忘了在服务中注入 IMapper,从源码中拷贝服务源码并修改。

     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 终归不是长久之计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构---递归实现十进制装换为任意进制

数据结构—递归实现十进制装换为任意进制 代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include"stack.h" stack Stack; void toAnyDigit(int n, int d) {//十进制转化为d进制if (n 0) {//递归结束的条件return;}int temp n % d;push(…

c++ string 删除字符_字符串操作的全面总结(附完整代码)

字符串操作看似简单&#xff0c;其实非常重要&#xff0c;不注意的话&#xff0c;经常出现代码运行结果和自己想要的不一致&#xff0c;甚至崩溃。本文总结了一些构建string对象方法、修改string对象的方法、string类型的操作函数、string类型的查找、string对象的比较。1 构建…

给Hangfire的webjob增加callback和动态判断返回结果功能设计

背景介绍通常业务中需要用到定时执行功能&#xff0c;我用hangfire搭建了一个调度服务&#xff0c;这个调度服务是独立于业务逻辑的&#xff0c;具体可以参考文章&#xff1a;https://github.com/yuzd/Hangfire.HttpJob/wiki也就是说只要我有了这个调度服务后&#xff0c;只要提…

C++实现双向链表

#include <iostream> using namespace std; typedef int ElemType;typedef struct DuLNode {//节点的创建ElemType data;struct DuLNode *prior, *next; } DuLNode, *DuLinkList;bool InitList(DuLinkList &L) {//初始化L new DuLNode;if (L NULL) {cout << …

word List32

word List32 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

spring aop实例讲解_Spring框架核心知识点

文章内容输出来源&#xff1a;拉勾教育Java高薪训练营前言&#xff1a;由于工作需要提升自身技术能力&#xff0c;在各方比较下&#xff0c;报名了拉勾教育的java高薪训练营&#xff0c;目前已经学了半个月啦&#xff0c;来说说自身学习的感受吧&#xff1a;课程内容有广度更有…

大数据常用数据库汇总

通常数据库分为关系型数据库和非关系型数据库&#xff0c;关系型数据库的优势到现在也是无可替代的&#xff0c;比如MySQL、SQL Server、Oracle、DB2、SyBase、Informix、PostgreSQL以及比较小型的Access等等数据库&#xff0c;这些数据库支持复杂的SQL操作和事务机制&#xff…

C++实现顺序栈

#include <iostream> using namespace std; #define MAXSIZE 100 typedef ElemType int;typedef struct//顺序栈的表示 {ElemType *base;ElemType *top;int stacksize; }SqStack;bool InitStack(SqStack &S)//初始化 {S.base new ElemType[MAXSIZE];if (!s.base){co…

word List 33

word List 33 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

深入理解ASP.NET Core依赖注入

概述ASP.NET Core可以说是处处皆注入&#xff0c;本文从基础角度理解一下原生DI容器&#xff0c;及介绍下怎么使用并且如何替换官方提供的默认依赖注入容器。什么是依赖注入百度百科中对于依赖注入的定义&#xff1a;控制反转&#xff08;Inversion of Control&#xff0c;缩写…

python3.7和3.5_Ubuntu更新python3.5到python3.7

一 下载 wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1rc2.tgz 二 解压 tar zxvf Python-3.7.1rc2.tgz cd Python-3.7.1rc2 三 编译 ./configure make make install 先找的python3.7解释器位置&#xff0c;一般是 /usr/local/bin/python3.7 四 删除原来的软连接 …

word List 34

word List 34 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

redis api 中文文档_我的Redis学习资料库

最近经常有人问我&#xff0c;我这边学习Redis都有哪些资料&#xff0c;能不能发他们一下。作为一个习惯”慢慢啃”技术学习的人&#xff0c;我确实积累了大量资料&#xff0c;这里可以介绍给大家。注明&#xff1a;本文提供的书籍、视频、源码、文档等&#xff0c;都是非盈利性…

前后端分离架构一直没机会实战?1周完成Vue+Core WebApi移动商城实战(含源码)!...

疫情让企业受到重创&#xff01;就业形势更加严峻&#xff01;前后端分离架构成了当下最高频的招聘需求还没实战过前后端分离&#xff1f;花3分钟阅读本文&#xff0c;带你全面了解前后端分离&#xff0c;轻松面试拿高薪&#xff01;Web发展至今技术非常成熟&#xff0c;主流有…

算法---宝藏最优选择问题

贪心算法—宝藏最优选择问题 原理参考趣学算法 代码&#xff1a; #include"quickSort1.h" 快速排序代码 int quickSort1(int a[], int l, int h) {//快速排序int i l, j h, p a[l];while (i < j) {while (i<j&&a[j]>p) {//从右往左遍历查找比…

C++实现循环队列

#include <iostream> using namespace std; #define MAXSIZE 100 typedef int ElemType;typedef struct {//队列的创建ElemType *base;int front;int rear; } SqQueue;bool InitQueue(SqQueue &Q) {//队列初始化Q.base new ElemType[MAXSIZE];if (!Q.base) {cout &l…

C# 的未来:主构造函数

我们上次提到主构造函数是 2014 年&#xff0c;当时&#xff0c; C# 6 和 VB 12 的候选列表上去掉了主构造函数。去年底&#xff0c;主构造函数重新出现&#xff0c;作为提案#2691 &#xff0c;现在成为 C# 9 的一个候选项。主构造函数背后的基本思想是减少初始化类所需的样板代…

python unpack_ip地址处理每天10行python代码系列

背景知识:ip地址(这里都是指的ipv4地址)是一个32位(4字节)的无符号整数。为方便记忆&#xff0c;把每个字节看做一个无符号数&#xff0c;并以.号隔开。比如常见的私有地址192.168.100.1, dns 114.114.114.114。下面这段代码&#xff0c;展示python如何处理ip地址的一些方法。i…

word List35

word List35 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

C++实现链队列

#include <iostream> using namespace std; #define MAXSIZE 100 typedef int ElemType;typedef struct QNode {//节点的创建ElemType data;struct QNode *next; } QNode, *QueuePtr;typedef struct {//队列的创建QueuePtr front;QueuePtr rear; } LinkQueue;bool InitQu…