当前位置: 首页 > 编程日记 > 正文

IdentityServer4关于多客户端和API的最佳实践【含多类型客户端和API资源,以及客户端分组实践】【中】...

上一篇文章中,我们已经完成了服务端数据库的搭建,本篇主要处理多【传统HTTP】【依赖CORE环境】客户端之间协同在线【SSO】以及不需要SSO的场景处理。

目标:

1)实现多类型客户端接入IdentityServer 后文简称【IDSV】

2)实现多客户端分组,使得可以控制分组内客户端进行协同和非协同登录和登出性状表现。

 你应该知道的:

1)关于cookie授权的基本操作,包括但不限于知道一个请求过来之后,客户端验证当前请求不关联用户声明,challenge之后对应是如何发起IDSV认证服务的。

上图是Microsoft.AspNetCore.Authorization.AuthorizeAttribute 该特性标签针对Action实现授权控制的全过程,步骤如下

     1.The request arrives at the server.//请求到达服务器

      2.The authentication middleware calls the default handler's Authenticate method and populates the HttpContext.User object with any available information.//授权中间件调用Authenticate 对应handler并且使用现有信息组装HttpContext.User

      3.The request arrives at the controller action.//请求即将抵达控制器

      4.If the action is not decorated with the [Authorize] attribute, display the page and stop here.//aciton没有Authorize验证要求,那么直接展示当前页面即可

      5.If the action is decorated with [Authorize], the auth filter checks if the user was authenticated.//action有Authorize验证,那么检查下当前user是否已经认证了

      6.If the user was not, the auth filter calls Challenge, redirecting to the appropriate signin authority.//如果这个用户没有认证,那么授权中间件发起问询,直接去找SignIn对应方案

      7.Once the signin authority directs the user back to the app, the auth filter checks if the user is authorized to view the page.//一旦SignIn方案对应服务器授权完毕并返回,这个时候授权中间件检查当前用户是否可以查看当前页面

      8.If the user is authorized, it displays the page, otherwise it calls Forbid, which displays a 'not authorized' page.//如果这个用户允许,那么就展示页面,如果这个用户拒绝了,那么就展示无权限页面。

2)Token是什么?

token中文翻译为令牌,获取令牌就是为了使客户端能够在令牌标识的范围内进行资源所有者的信息获取,当然获取的来源一般是ProtectApi,本篇暂时不谈。

GO:

  1)Core环境下客户端接入

    CORE环境下客户端接入比较简单,只需要知道授权服务器地址,即可完成接入,依赖系统本身的COOKIE组件,我们可以加密轻松实现OIDC流程。

  代码截图如下:

    

其中【1】中代码解释如下:

DefaultScheme:当前系统验证默认的方案名称

DefaultSignInScheme:当前系统账户登录时默认的处理方案名称

DefaultChallengeScheme:当前系统发生问询时,默认的处理方案名称,图示为oidc,该方案为【2】中OpenIdConnnect的对应方案全称

其中【2】中代码解释如下:

SignInScheme:远程服务器登录完毕之后,回调客户端登录的处理方案,本文是Cookies对应上方AddCookie(**)的名称。

RequireHttpsMetadata:是否要求请求必须含HTTPS元数据。

Authority:授权服务器地址。

ClientId:当前客户端ID。【该客户端需要在服务端注册,也就是服务端必须得知道这个客户端是谁?】

ClientSecret:客户端秘钥。【该客户端在服务器上所承认的客户端密码】

Scope:当前客户端发起问询请求时,所需要请求的资源范围,注意:offline_access决定了授权服务器是否颁发RefreshToken,添加的资源范围必须在服务器针对该客户端配置的允许范围以内,也就是是其子集,当然此处包含对应的Api资源和IdentityResource资源。

ResponseType:资源服务器回给客户端的类型,图示为Code/IdToken两种回调参数。

SaveTokens:是否自动保存Token。

GetClaimsFromUserInfoEndpoint:是否自动根据token请求授权服务器的用户根节点获取用户。

完成授权登录之后,可以在cookie中查看到一下cookie资料,该信息也即授权服务器回调SignIn方案所维持登录自动保存的cookie。

别忘了在Configure中注册 app.UseAuthentication();使所有的请求都要验证哦。

做完了以上配置,我们就完成了客户端调用服务器的配置,是不是非常的简单呢~


2)net framework 4.x环境下接入

网上找了很多资料,关于IDS4作为服务器,传统HTTP请求接入的资料并不多,这部分只能靠识别GITHUB源码来剖析客户端接入的请求,然后转化成自己的代码,使用HTTP最大的好处就是跨平台和语言,以下内容以C#语言作为示例,别的语言也同理可得。

1.在一个触发登录的唯一入口  发起远程服务器的302请求,代码截图如下:

上文中,这部分代码对应的源码如下:

Url的组成源码如上,等价于自己拼接URL请求即可,参数部分简单说一下:

responseMode:这个参数标识了回给客户端的Code/IdToken是通过什么方式

redirectUri:这个参数也就是服务器所知道的回给客户端的回调地址【在回调中用户自己完成回调参数的使用和处理】

state/nonce:这两个参数是保证不会有中间人搞事情,state回调的时候检查与发起时是否相同,来判断颁发的这个有没有在中间被人篡改过包。后面那个nonce是一次性的随机码,保证了code只有一次试用机会。

2.回调处理

不像是core下封装好的组件,回调的部分需要我们自己处理code以及idtoken

这部分代码截图如下:

这部分代码偷懒了,少了很多验证,不过不影响DEMO。

在完成code获取之后,拿这个code去授权服务器换取真正的token,之后就看怎么玩了,上述代码将id_token  code token以及token对应人存储到cookie中,其实这部分关于cookie的时效,应该做到与返回的TokenResponse的有效时间同步,在当前token失效之后

发起RefreshToken的接口调用,示意如下:

以上即完成了netfx客户端接入IDSV服务器,并获取token实际信息的全部过程。


3)关于多客户端SSO与非SSO登录的场景处理。

这部分资料网上也很少,因为IDS4天生的就实现了多客户端协同在线的问题,说到底就是服务端账户在线,新的子客户端连入的时候,直接问询当前账户权限接入是否允许的问题,那么就有场景是需要有些客户端不在输入用户信息,有些必须要强制输入。

这部分我的逻辑如下:

1.IDSV实现IAuthorizeInteractionResponseGenerator端口,该端口即是负责客户端同意页面的逻辑,为什么要自定义这个端口呢?因为SSO单点登录的时候,我这边设置了必须要过同意页面,所以在这个逻辑里面处理客户端分组,进而决定是否重新回到登录页面。

代码如图:

以上实现了针对客户端进行分组检查以及强制重登的核心逻辑。

2.与1中同步合作的必须是登录逻辑,核心验证如下:

在强制登录的客户端完成登录接口,准备return之前,给当前登录主体,完成新的声明插入。


【如果看完之后有所启发,不要吝啬您的点赞哦~】

转载于:https://www.cnblogs.com/parvin-zhang/p/9258283.html

相关文章:

WEB SSH Ajaxterm客户端配置(1)

Ajaxterm是一款基于Web的SSH客户端软件,它是采用Python编写的,这也就保证了它能在多种Linux发行版的系统中使用,同时它的安装非常简单。实验环境:Centos 5.5 ip:192.168.20.165pcre-7.8.tar.gzAjaxterm-0.10.tar.gzn…

如何为回归问题选择最合适的机器学习方法?

作者 | 何从庆本文经授权转载自 AI算法之心(id:AIHeartForYou)在目前的机器学习领域中,最常见的三种任务就是:回归分析、分类分析、聚类分析。在之前的文章中,我曾写过一篇《15分钟带你入门sklearn与机器学…

【Qt】获取本地IP(IPv4)

1、问题描述 获取本地IP列表有“127.0.0.1”、IPv4、IPv6等,一般使用IPv4,如何从已经获取的IP列表中挑出IPv4。 2、解决方法 QString ipv4; auto ips = QNetworkInterface::allAddresses(); foreach (auto ip, ipps) {if ( (ip.

2.2元组介绍+字符串操作

元组可以理解为“一旦创建就不能再修改的列表”,所以也叫只读列表 语法:names("A","B","C","D") 他只有两个方法: ①count ②index 字符串操作: 示例:name"chan" 1…

医生再添新助手!深度学习诊断传染病 | 完整代码+实操

作者 | Dipanjan (DJ) Sarkar译者 | Monanfei编辑 | Rachel、Jane出品 | AI科技大本营(id:rgznai100)【导读】文本基于深度学习和迁移学习方法,对疟疾等传染病检测问题进行了研究。作者对疟疾的检测原理以及迁移学习理论进行了介绍…

DIV限制宽度,字符断行,避免变形

代码如下&#xff1a;<div style"width:740px;word-break:break-all;word-wrap:break-word;">参考文章怎么强制限制div宽度转载于:https://www.cnblogs.com/leftfist/archive/2012/02/07/4258078.html

【渗透】node.js经典问题

1.循环问题 当循环调用 require() 时&#xff0c;一个模块可能在未完成执行时被返回。例如以下情况:a.js: exports.done false; const b require(./b.js); console.log(在 a 中&#xff0c;b.done %j, b.done); exports.done true; console.log(a 结束); b.js: console.log…

【Qt】Ubuntu下Qt应用程序自启动设置

1、问题描述 第一步,确保手动启动Qt程序没有报错!如果报以下错误,参见博客 qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. This application failed to s…

Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

转载自&#xff1a;http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念&#xff1a; 1.割点&#xff1a;若删掉某点后&#xff0c;原连通图分裂为多个子图&#xff0c;则称该点为割点。 2.割点集合&#xff1a;在一个无向连通图中&#xff0…

【JavaScript】Ubuntu16.04安装vscode+npm+yarn

一、安装vscode vscode官网&#xff08;https://code.visualstudio.com/&#xff09;下载linux deb文件 下载deb后&#xff0c;使用dpkg -i 命令安装 sudo dpkg -i code_1.45.1-1589445302_amd64.deb在终端执行命令code来启动vscode 二、安装nodejs curl -sL https://deb…

C++大数加法

1 #include <iostream>2 #include<deque>3 #include<string>4 5 using namespace std;6 7 string add(string a, string b) //此函数默认a的长度大于b(可以在main函数里用if语句控制a的长度大于b)8 {9 deque<int>sum; //sum用来存储和的每…

重磅!Facebook更新PyTorch 1.1,打算跨GPU分割神经网络

时隔半年不到&#xff0c;PyTorch 已经从之前的 1.0 升级到 1.1 版本了。刚刚&#xff0c;Facebook 在年度开发者大会 F8 上宣布正式发布 PyTorch 1.1 版本&#xff0c;这是对 PyTorch 1.0 的一次大的功能升级。 作者 | 琥珀 出品 | AI科技大本营&#xff08;ID:rgznai100&…

红旗Linux认证简介

红旗Linux认证 一、课程名称&#xff1a;红旗Linux认证产品专家&#xff08;RAP&#xff09; 课程简介&#xff1a; 主要针对初次使用红旗Linux desktop的学员而编制&#xff0c;注重实用性&#xff0c;是红旗Linux的一门入门课程。 采用的教材是《红旗Linux桌面应用教程》&…

【Git】git clone时下载速度太慢的解决方法(亲测有效)

1、参考博客 https://www.jianshu.com/p/3f6477049ece2、原因 git clone特别慢是因为github.global.ssl.fastly.net域名被限制了。 只要找到这个域名对应的ip地址&#xff0c;然后在hosts文件中加上ip–>域名的映射&#xff0c;刷新DNS缓存便可。 3、解决方法 3.1 获取I…

JHipster技术简介

本文简单介绍Jhipster是什么&#xff0c;为什么用Jhipster&#xff0c;怎么用Jhipster。 WHAT - 技术栈 JHipster是什么 JHipster是一个开发平台&#xff0c;用于生成&#xff0c;开发&#xff0c;部署Spring Boot Angular/React Web Application和Spring microservices。 JHi…

如何确定最佳训练数据集规模?6 大必备“锦囊”全给你了

【导读】对于机器学习而言&#xff0c;获取数据的成本有时会非常昂贵&#xff0c;因此为模型选择一个合理的训练数据规模&#xff0c;对于机器学习是至关重要的。在本文中&#xff0c;作者针对线性回归模型和深度学习模型&#xff0c;分别介绍了确定训练数据集规模的方法。 作者…

Android实现左右滑动效果

本示例演示在Android中实现图片左右滑动效果。 关于滑动效果&#xff0c;在Android中用得比较多&#xff0c;本示例实现的滑动效果是使用ViewFlipper来实现的&#xff0c;当然也可以使用其它的View来实现。接下来就让我们开始实现这种效果。为了方便大家理解&#xff0c;我们先…

假如AI也会diss人类,他们会这样.....

1酷炫、未来感、强大、没灵气、不给力、垃圾、高深——如果有一个东西适用于以上所有这些词&#xff0c;那它一定是人工智能。人工智能的火爆一直伴随着争议和调侃。尤其是现在&#xff0c;大数据和机器学习已经融入到我们的生活&#xff0c;网上关于人工智障的吐槽却只增不减。…

[Go]在vscode中添加对模板文件tmpl的html语法自动补全的支持

1、打开设置界面 依次点击&#xff1a;“文件” --> “首选项” --> “设置” 2、打开文件配置 依次点击&#xff1a;“文本编辑器” --> “文件” --> “在settings.json中编辑” 3、添加对tmpl后缀文件的html语法自动补全支持 4、效果 html关键字高亮显示…

Docker 宿主机定时清除容器的运行日志

为什么80%的码农都做不了架构师&#xff1f;>>> docker 宿主机定时清除容器的运行日志 一般docker容器都是最小化安装&#xff0c;不仅如此系统定时器相关的服务也不存在&#xff0c;自己去安装也很麻烦&#xff0c;故此直接使用宿主机的定时器即可。 一、在容器中…

企业数据库合规的最佳实践

PCI DSS当前对于数据库要求有下述明确的控制措施&#xff1a; • 对访问任意数据库的所有用户进行认证。 • 所有用户访问任何数据库时&#xff0c;用户的查询和操作&#xff08;例如移动、拷贝和删除&#xff09;只能通过编程性事务&#xff08;例如存储过程&#xff09;。 •…

Docker网络解决方案-Flannel部署记录

Docker跨主机容器间网络通信实现的工具有Pipework、Flannel、Weave、Open vSwitch&#xff08;虚拟交换机&#xff09;、Calico实现跨主机容器间的通信。其中Pipework、Weave、Flannel&#xff0c;三者的区别是&#xff1a; Weave的思路 12在每个宿主机上布置一个特殊的route的…

【FFmpeg】警告:[hls] pkt.duration = 0, maybe the hls segment duration will not precise

1、问题描述 在使用ffmpeg编程生成m3u8文件时,报警告 [hls @ 0x7f26b4181840] pkt->duration = 0, maybe the hls segment duration will not precise2、原因分析 根据警告提示信息, AVPacket.duration的值设为了0,可能会导致hls在分段时时间不精确。 根据警告信息搜索…

反转字符串/列表、改变递归次数限制、else用法...Python 冷知识(四)

本文转载自Python编程时光&#xff08;ID:Python-Time&#xff09;冷知识系列&#xff0c;已经更新至第四篇。前三篇传送门在此&#xff0c;还没阅读的可以学习一下。谈谈 Python 那些不为人知的冷知识&#xff08;一&#xff09;谈谈 Python 那些不为人知的冷知识&#xff08;…

我学Delphi心得与笔记-------在控件上如何禁用Ctrl+V

项目中用到一个TJamShellList组件&#xff0c;此组件实现绑定查询图片&#xff0c;发现在使用CtrlC的同时也可以使用CtrlV结果将一个图处复制了多份&#xff0c;这样就不行了:( 于是&#xff0c;想了一个办法&#xff0c;禁用了CtrlV组合按键,代码如下: //在KeyDown事件中写如下…

15分钟带你入门sklearn与机器学习——分类算法篇

作者 | 何从庆本文转载自AI算法之心&#xff08;ID:AIHeartForYou&#xff09;【导读】众所周知&#xff0c;Scikit-learn&#xff08;以前称为scikits.learn&#xff09;是一个用于Python编程语言的免费软件机器学习库。它具有各种分类&#xff0c;回归和聚类算法&#xff0c;…

【FFmpeg】警告:[mpegts] H.264 bitstream error, startcode missing, size 0

1、问题描述 在使用FFmpeg编程,编码成h.264后,再封装成hls时,报警告 [mpegts] H.264 bitstream error, startcode missing, size 02、原因分析 根据警告提示信息可知:264位流错误,开始码丢失,大小为0。 根据警告信息搜索源码,在 FFmpeg-n4.2.2/libavformat/mpegtsenc…

svg: svg预定义的形状

SVG 有一些预定义的形状元素&#xff0c;可被开发者使用和操作&#xff1a;矩形 <rect>圆形 <circle>椭圆 <ellipse>线 <line>折线 <polyline>多边形 <polygon>路径 <path> 矩形 <rect x"20" y"20" width&qu…

[转]会自动消失的对话框API函数:MessageBoxTimeout

//以下两个函数由user32.dll导出&#xff0c;只是没有微软官方文档记载&#xff0c;大家在cpp中包含了以下部分&#xff0c;就可以调用MessageBoxTimeout了。 extern "C"{int WINAPI MessageBoxTimeoutA(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UI…

GitHub告急!黑客威胁程序员不交钱就删库

作者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;5月3日&#xff0c;当中国程序员正愉快地过五一节时&#xff0c;国外程序员突然发现自己GitHub上的代码不翼而飞&#xff01;自己的GitHub一秒变成悬疑片现场&#xff0c;不仅被黑客攻击删代码了&#…