【One by One系列】IdentityServer4(一)OAuth2.0与OpenID Connect 1.0

在微服务场景中,身份认证通常是集中处理,这也是有别于单体应用一把梭哈的模式,其中,在微软微服务白皮书中,提供了两种身份认证模式:

  • 网关,没错,原话是If you're using an API Gateway, the gateway is a good place to authenticate

img
  • STS(security token service)

Diagram showing authentication through backend microservices.

如果使用网关进行集中身份认证,微服务如果没有设置了额外的安全性来验证消息,就必须确保微服务在没有经过网关的时候,不能直接被访问。从图中也可看到,用户信息是由网关进行转发请求时增加的。

如果使用STS进行集中身份认证,是可以直接访问服务,需要使用安全令牌服务(STS)的专用身份验证单独的服务(微服务)对用户进行身份验证。由STS颁发token,然后在请求微服务时就需要在请求中携带token。

我们文章后续:主要就是围绕着STS安全令牌服务中间件IdentityServer4来具体展开的。

1.引言

1.1 实际遇到的问题

在之前一个单体web系统中,采用的是前后端分离,前端是Vue 2.0,后端使用的ASP.NET Web Api 2.0提供后台服务,登录模块采用了JWT(JSON WEB TOKEN)的身份认证方式,在用户请求时后台自定义解析JWT,然后把解析的部分结果装进HttpContext.Principal,供后续授权操作。那时会遇到一个问题,前端并没有mock开发,而是连接后端测试环境开发,前端在开发调试时,后端同步发布最新接口,再加上IIS老版本发布web服务,会有一个初次访问非常慢的问题,这时前端就会炸锅,“后端挂了?请求不到JWT”,这个过程其实挺影响开发效率的,那时就萌生了把身份认证和授权单独作为一个项目部署,由于本身属于项目基础设施,改动的频率几乎为0,业务层面也可以按需拆分,这可能就是我最早微服务思路的萌芽吧!

1.2 其他问题

微信公众号开发

做过微信公众号开发,我们大多数应用都希望用户通过微信进行操作,然后留存用户信息,我们需要经过如下步骤:

  • 向微信官方申请AppId,Appsecret,还有单独一个加密密钥

  • 然后请求https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6953deeefe22a83b&redirect_uri=your_address&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

    • 这里用户访问,需要用户授权

  • 然后微信浏览器会重定向至上一步的redirect_uri指定的网址,且还会在querystring加上code

    • 这个code,记住

  • 然后就可以通过code,https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code在后台获取access_token,openid

    • access_token是凭证

    • openid是微信的用户体系

  • 最后就能通过https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN,就能通过上一步中获取到的access_token,获取微信用户的信息

类似的还有华为开放平台鉴权

2.OAuth 2.0

无论是微信公众号,还是华为开发平台,他们为了构造自己的生态,运用自己庞大的用户基数,去为第三方提供服务(如果可以的话,顺便收钱),但是他们面临的问题:

  • 不能直接把用户的信息直接暴露,不然就是侵权行为

  • 更不可能把用户的用户名和密码直接暴露

怎么办?第三方应用程序需要知道当前操作的用户身份,就需要身份验证,这时OAuth协议应运而生,OAuth2.0引入了一个授权层,分离两种不同的角色:

  • 客户端

  • 资源所有者(用户)

只有用户同意以后,服务器才能向客户端颁发令牌,客户端通过令牌Token去请求数据,从某种意义上说OAuth2.0是一种委托协议,把原本可能需要用户名和密码才能拿到的数据,通过授权(Authorization)产生的access-token,并以此来进行相关访问。

简单说系统用户允许某个应用代表他们访问用户自己能够控制的资源。

OAuth 2.0包含如下主要内容:

2.1 授权方式

实际上,OAuth2.0有4种授权方式

  • 授权码-authorization-code

  • 隐藏式-implicit

  • 密码式-password

  • 客户端凭证-client credentials

不管哪一种授权方式,第三方应用申请令牌之前,都需要像微信公众号开发那样,必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会也不可能拿到令牌的。

2.2 端点

  • Authorization Endpoint ,授权端点

  • Token Endpoint ,Token端点

2.3 Scope

代表资源所有者在被保护的资源那里的一些权限,可以把被保护的资源分为不同的scope,这个粒度由开发者自定义,常见的有角色

2.4 Access Token

  • 用来访问被保护资源的凭据

  • 代表了给客户端颁发的授权,也就是委托给客户端的权限

    • OAuth2.0没有对Token的格式和内容定义,只有有一个要求:Access-token要描述出资源所有者授予权限的范围,也就是scope,以及Access-token的有效期

2.5 Refresh Token

  • 获取Access token的凭据

  • 由授权服务器颁发

  • 它是一个可选项

  • 具备让客户端应用逐渐降低访问权限的能力

    • 可以在Refresh Token请求重新获取Access Token时,做一个设计,根据实际需求,给一个权限越来越低的token

3.OpenId Connect 1.0

上一节说过,OAuth 2.0是一种授权机制,是一种委托协议,但是不是一个身份认证协议。OAuth2.0的Access Token不含有身份认证信息,也不是为客户端准备的,本身也不对客户端透明,Access Token真正的受众是被保护的资源。

当然我们不排除一些简单的系统鉴权要求,它只需限制对是否具有有效安全令牌的用户的访问,并不需求身份认证。

OAuth2.0设计的Access Token不含有身份认证信息,但是JWT具有自包含特点,其实我们是可以把Access-Token设计为即具有身份信息,又包含授权信息。在一些简单的单体应用中,把身份认证和授权揉在一起,根据Access_Token解析身份信息和然后再根据身份信息,配合设计的权限规则(db存储)过滤请求,的确可以这样做,事实上有一些开源项目,包括我自己,都这样干过。

在一些实际场景下,这种使用access-token作为身份认证的凭据是成立的,因为token是经过身份认证后,刚被创建的,再加上后续验证与数据存储的交互,可以确保无虞。

但是如果是在OAuth2.0中,这并不是获取access-token的唯一方法。Refresh Token和assertions可以在用户不存在的情况下获取access token。而在某些情况下,用户无需身份验证即可获得access token。另外用户不存在,access-token通常还会存在很长时间。记住重要的一点:OAuth是一个授权协议,保护的是资源,突出一个保护,那么必须保证用户是存在的;access-token受众是受保护的资源,客户端是授权的提出者,因此受保护的资源不能仅通过token的单独存在来判断用户是否存在,因为 OAuth 协议的性质和设计,在客户端和受保护资源之间的连接上,用户是不可用的。

当应用程序需要知道当前用户的身份时,就需要进行身份认证。通常,这些应用程序代表该用户管理数据,并需要确保该用户只能访问允许他访问的数据。

目前最常见的身份验证协议是SAML2p、WS-Federation和OpenID Connect——SAML2p是最流行和部署最广泛的。

OpenID Connect是三者中最新的一个,但是却被认为是未来的发展方向,因为它对现代应用程序具有最大的潜力。它从一开始就为移动应用场景而构建,并被设计为对API友好。

OpenID Connect

  • 是基于OAuth 2.0协议之上的简单身份层,是在OAuth2.0之上做的一个扩展,兼容OAuth2.0,身份验证和API访问这两个基本的安全问题被组合成一个协议——通常只有一次到**安全令牌服务(STS)**的往返,所以这里没有详细介绍OAuth2.0的授权流程的原因,因为OpenId Connect几乎包含了整个OAuth2.0

OAuth 2.0与OpenID Connect1.0 映射表

OAuth2.0OpenID Connect 1.0
资源所有者用户
客户端依赖方
授权服务器+被保护资源身份提供商

OpenId Connect 1.0包含如下主要内容:

3.1 ID Token

包含了用户的认证信息

3.2 UserInfo端点

获取用户信息

3.3 预设

一组标识身份的scopes和claims

  • profile

  • email

  • address

  • phone

3.4 OpenID Connect 流程

  • 授权码流程-Authorization Code Flow

  • 隐式流程-Implicit Flow

  • 混合流程-Hybrid Flow

4.OpenID Connect 与 OAuth 2.0

下一篇我们将正式开始介绍对OpenID Connect+OAuth2.0这两种协议的实现中间件:IdentityServer4,其经过高度优化,可以解决当今移动、本机和web应用程序等典型的安全问题。

在不同的文献对可能会同一角色使用不同的术语,所以IdentityServer又可称为安全令牌服务(STS)、身份提供者(IDP)、授权服务器(AuthServer)、IP-STS等等。它的主要职责也就是OAuth2.0与OpenID Connect职责的综合,

也是IdentityServer4的职责:

  • 保护资源

  • 使用本地用户存储或通过外部身份提供程序对用户进行身份认证

  • 提供session管理和单点登录

  • 管理和认证客户端

  • 向客户端颁发身份标识和访问令牌

  • 验证Token

我们来回顾一下两个协议的要点,

也是IdentityServer4的要点:

  • 必须先到系统备案

  • 授权端点

  • 获取Toekn端点

  • 获取用户信息端点

  • 刷新Token端点

  • ID token

  • 不同的权限scope

我们将在后续文章中一一对应职责与要点

参考链接

http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

https://www.cnblogs.com/linianhui/p/authentication-based-on-oauth2.html#auto-id-3

https://www.cnblogs.com/linianhui/p/oauth2-extensions-protocol-and-json-web-token.html#auto_id_2

https://www.cnblogs.com/linianhui/p/oauth2-authorization.html#auto_id_17

https://www.cnblogs.com/linianhui/p/oauth2-extensions-protocol-and-json-web-token.html#auto_id_2

https://www.cnblogs.com/linianhui/p/oauth2-extensions-protocol-and-json-web-token.html#auto-id-2

https://www.scottbrady91.com/OpenID-Connect/OpenID-Connect-Flows

https://identityserver4.readthedocs.io/en/latest/intro/big_picture.html

长按二维码关注

点外卖,先领券

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

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

相关文章

php多进程 写入文件_PHP多进程中使用file_put_contents安全吗?

TL;DRLinux下,PHP多进程使用 file_put_contents() 方法记录日志时,使用追加模式(FILE_APPEND),简短的日志内容不会重叠,即能安全的记录日志内容。file_put_contents() 使用 write() 系统调用实现数据的写入,write() 系…

虚拟机概述[转贴]

[摘要]描述什么是虚拟机、及运行在各种平台上的多种多样的虚拟机软件PXE2写著 你一定接触过各种各样的虚拟机,Vmware,VirtualPC,甚至JVM或是VBRunDLL,等等等等,在数字的信息世界里虚拟和现实是如此的难解难分。你一定接…

ABP vNext分布式事件总线RabbitMQ注意事项

[https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文档链接),基本使用可直接阅读官方文档,云怀不重复造轮子,只做官方未提到但重要的说明关键配置说明关键配置类:AbpRabbitMqE…

window运行php环境,Windows环境下使用phpstudy搭建php运行环境

首先在百度百科上对于phpstudy的定义是一个PHP调试环境的程序集成包。该程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境,该程序不仅包括PHP调试环境,还包括了…

去除代码行号的一个小程序(控制台版本)

清风竹林发布了去除代码行号的一个小程序,确实方便大家收集一些文章代码,但个人认为象这样的小东东,要使广大网友能拿来就用,用.Net 2.0做成WinForm,有点贵族化了,于是动手整出个平民化的控制台版本,可以清除指定的文本…

. NET5实战千万高并发项目,性能吊打JAVA,C#排名万年老五,有望逆袭!

“秒杀活动”“抢红包”“微博热搜”“12306抢票”“共享单车拉新”等都是高并发的典型业务场景,那么如何解决这些业务场景背后的难点问题呢?秒杀系统中,QPS达到10万/s时,如何定位并解决业务瓶颈?明星婚恋话题不断引爆…

java不朽神迹,不朽的神迹 Eternal Legacy HD v1.0.8

游戏简介不朽的神迹是一个拥有全3D实时渲染的史诗战斗场面、360度自由调整的视角及丰富的动作特效的游戏。玩家将在游戏中探索壮丽的大陆,体验张力十足的战斗系统。游戏提供了多至3名角色同时参战,可从队伍成员中选择出战的队友,并且定义他们…

ABP vNext 审计日志获取真实客户端IP

背景在使用ABP vNext时,当需要记录审计日志时,我们按照https://docs.abp.io/zh-Hans/abp/latest/Audit-Logging配置即可开箱即用,然而在实际生产环境中,某些配置并不可取,比如今天的主角——客户端IP,记录用…

郭昶

郭 昶左直拳饰演《外来媳妇本地郎》中康家老二康祁宗的演员郭昶6月14日去世了,胃癌,享年50岁。这个消息真令人难以置信,不胜嘘唏。 《外来媳妇本地郎》在广东这边很受欢迎,每集结尾那带有浓厚岭南特色的粤曲小调在胡同小巷时有…

php 常用rpc框架,php的轻量级rpc框架yar

php的轻量级rpc框架yar目的:类方法的远程调用,也就是一个rpc请求。RPC本质上也是一个网络请求,既然是请求,对于效率来说,就需要考虑了。yar是基于http来做的。使用场景:多个项目共享model总的来说这种调用代价挺好的&a…

ABP vNext IOC替换原有Service实现

即 .NET IOC替换原有Service实现背景在使用ABP vNext时,该框架为我们实现了非常多的默认行为,以便开箱即用,但在实际使用中,我们总是需要根据自己的需求定制自己的服务,在.Net框架中,便提供了Service.Repla…

aqs java 简书,Java AQS源码解读

1、先聊点别的说实话,关于AQS的设计理念、实现、使用,我有打算写过一篇技术文章,但是在写完初稿后,发现掌握的还是模模糊糊的,模棱两可。痛定思痛,脚踏实地重新再来一遍。这次以 Java 8源码为基础进行解读。…

仓储模式到底是不是反模式?

【导读】仓储模式我们已耳熟能详,但当我们将其进行应用时,真的是那么得心应手吗?确定是解放了生产力吗?这到底是怎样的一个存在,确定不是反模式?一篇详文我们探讨仓储模式,这里仅我个人的思考&a…

网络工程师必须懂的十五大专业术语!

1、什么时候使用多路由协议? 当两种不同的路由协议要交换路由信息时,就要用到多路由协议。当然,路由再分配也可以交换路由信息。下列情况不必使用多路由协议: 从老版本的内部网关协议( Interior Gateway Protocol&…

dnSpy反编译、部署调试神器

一、概要在工作当中,当程序部署了之后就算打了日志遇到极个别的特殊异常没有在程序日志中体现出来或者没有详细的报错原因会让开发者非常头疼,不得不盲猜bug到底出在哪里。这里分享一下工作上经常会用到的工具,这款工具可以反编译并运行调试已…

java中内边距跟外边距,padding和margin——内边距和外边距

一、padding——内边距(内填充)1.1、padding 简写属性在一个声明中设置所有填充属性。该属性可以有1到4个值。div.outer{width: 400px;height: 400px;border: 2px solid #000;}div.inner{width: 200px;height: 200px;background-color:red ;padding: 50px;}运行效果图&#xff…

AJAX将成为移动Web2.0时代首选开发平台

一、 引言  最近,Opera宣布通过他们的浏览器把AJAX技术应用于移动设备开发中。考虑到Opera浏览器在目前浏览器市场(特别是在移动浏览器市场)的流行性,我们可以预计这一宣布对于整个浏览器市场必然会产生重要影响。从加入到移动服务开发市场几年的经验来看,我相信现…

matlab仿真习题,(MATlab仿真部分习题答案.doc

(MATlab仿真部分习题答案[4.1]控制系统结构如图4.1所示利用MATLAB对以上单位负反馈控制系统建立传递函数;将第一问中求得的传递函数模型转化为零极点增益形式和状态空间形式。解:(1)num[2 2];den[1 2 1];[num1,den1]cloop(num,den);systf(num1,den1)程序运行结果如下…

使用 ML.NET 实现峰值检测来排查异常

机器学习中一类问题称为峰值检测,它旨在识别与大部分时序中明显不同但临时突发的数据值。及时检测到这些可疑的个体、事件或观察值很重要,这样才能尽量减少其产生。异常情况检测是检测时序数据离群值的过程,在给定的输入时序上指向“怪异”或…

如何使用Tasklist命令

Tasklist命令用来显示运行在本地或远程计算机上的所有进程,带有多个执行参数。使用格式Tasklist [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]参数含义/S system 指定连接到的远程系统。/U [domain]user…