Identity Server 4 预备知识 -- OpenID Connect 简介

我之前的文章简单的介绍了OAuth 2.0 (在这里: 要用Identity Server 4 -- OAuth 2.0 超级简介, 还不是很全.

这篇文章我要介绍一下 OpenID Connect.

OAuth 2.0 不是身份认证协议

OAuth 2.0 不是身份认证(Authentication)协议. 为什么有人会认为OAuth 2.0具有身份认证的功能? 这是因为OAuth2经常作为身份认证(Authentication)协议的一部分来使用. 例如在典型的OAuth2流程里, OAuth2经常会嵌入一些身份认证的事件.

那么身份认证(Authentication)是什么?

我们这里所说的身份认证就是指它可以告诉应用程序当前的用户是谁, 还有这些用户是否正在使用你的应用程序. 它是一种安全架构, 它可以告诉你用户是他们所声明的身份, 通常呢, 是通过提供一套安全凭据(例如用户名和密码)给应用程序来证明这一点.

而OAuth2则不管用户这些东西, OAuth2的客户端应用只考虑请求token, 得到token, 使用token访问API. 它不关心谁给客户端应用授权了, 也不关心是否有最终用户.\

 

身份认证(Authentication) vs 授权(Authorization)

引用《OAuth 2.0 in Action》里面的一个比喻来解释, 把身份认证看作是软糖, 而授权是巧克力. 这两种东西感觉略有相似, 但是本质上却截然不同: 巧克力是一种原料, 而软糖是一种糖果. 可以使用巧克力作为主要原料做出巧克力口味的糖果, 但是巧克力和软糖绝不是等价的.

尽管巧克力可以单独作为一种最终产品, 但在这个比喻里巧克力是一种非常有用原料, 它极具多样性, 可以用来做蛋糕, 冰激凌, 雪糕等等.

 

在这个比喻里 OAuth 2.0 就是巧克力, 它是众多web安全架构的一种多用途的基本成分.

而软糖, 是一种糖果. 有一种特别可口的软糖叫做巧克力软糖. 很显然, 巧克力在这种软糖里是主要成分, 但是它还需要其它原料成分和一些关键的流程把巧克力转化成巧克力软糖.

制做出的产品是软糖的形式, 它以巧克力为主要成分. 这叫使用巧克力来制作软糖, 所以说巧克力不等价于软糖.

在这个比喻里, 身份认证就更像软糖, 它需要一些关键的组件和流程, 而却要把这些组件和流程通过正确的组合起来并安全的使用, 针对这些组件和流程还是有很多的选项的.

可以说我们要制作巧克力软糖, 也就是需要一个基于OAuth2的身份认证协议. 而OpenID Connect就是这样的开放标准, 它可以工作于不同的身份供应商之间. OpenID Connect 基于 OAuth 2.0, 在此之上, 它添加了一些组件来提供身份认证的能力.

 

OpenID Connect的官方定义是: OpenID Connect是建立在OAuth 2.0协议上的一个简单的身份标识层, OpenID Connect 兼容 OAuth 2.0

 

OAuth 2.0与身份认证协议的角色映射

想要基于OAuth2构建身份认证协议, 那么就需要把OAuth2里面的那些角色映射到身份认证的事务里面.

在OAuth2里面, 资源所有者(Resource Owner)和客户端应用(Client)经常在一起工作, 因为客户端应用代表了资源所有者. 而授权服务器(Authorization Server)和被保护的资源(Protected Resource)经常在一起, 因为授权服务器生成token, 而被保护的资源接收token. 所以说在最终用户/客户端应用 与 授权服务器/被保护资源 之前存在一个安全和信任的边界, 而OAuth2就是用来跨越这个边界的协议.

而在身份认证的事务里, 最终用户使用身份提供商(Identity Provider, IdP)登录到依赖方(Relying Party, RP, 可以理解为客户端).

总结一下前面这段话:

OAuth2里可以分为两部分: 1.资源所有者/客户端应用, 2.授权服务器/被保护资源.

身份认证协议里也是两大部分: 1.依赖方, 2.身份提供商.

所以考虑这样映射:

  • OAuth2里的授权服务器/被保护资源 ---- 身份认证协议里的身份提供商进行映射

  • OAuth2里面的资源所有者 ---- 身份认证协议里的最终用户

  • OAuth2的客户端应用 ---- 身份认证协议里的依赖方(RP).

640?wx_fmt=png

OAuth2里, 资源所有者的权限会委派给客户端应用, 但这时该权限对应的被保护资源就是他们自己的身份信息. 也就是说他们授权给依赖方(RP), 让其可以知道现在是谁在使用应用, 而这就是身份认证事务本质.

依赖方现在就可以知道是谁在使用系统并且他们是如何登录进来的. 不过这里还需要用到另外一种token, 叫做ID token, 这种token携带着身份认证事件本身的信息.

那么为什么不使用OAuth2里的access token把这些事都一次性解决了呢? 

因为首先access token不含有任何关于身份认证的信息; 其次access token的生命期可能会非常的长, 即使用户离开了它仍有可能有效, 它还有可能被用于无最终用户参与的情况; 还有一种情况就是access token可能会被其它的客户端应用借用. 所以, 无论客户端是如何得到的access token, 它都无法从access token里得到最终用户的信息以及最终用户的身份认证状态.

在OAuth2里, access token不是为客户端准备的, 它对于客户端应该是不透明的, 但是客户端也需要从access token得到一些用户信息. 实际上客户端应用只是access token的展示者, access token真正的目标观众是被保护的资源.

在OpenID Connect里, 这个第二个叫做ID Token, 它会和access token一同发送给客户端应用.

 

OpenID Connect

OpenID Connect是由OpenID基金会于2014年发布的一个开放标准, 简单的说就是, 它使用OAuth2来进行身份认证. OpenID Connect直接构建于OAuth2.0的基础之上, 与其兼容. 通常OpenID Connect是和OAuth2一同部署来使用的.

 

OpenID Connect的整体抽象流程如下图所示: 

640?wx_fmt=png

1. 依赖发(RP)发送请求到OpenID提供商(OP, 也就是身份提供商).

2. OpenID提供商验证最终用户的身份, 并获得了用户委派的授权

3. OpenID提供商返回响应, 里面带着ID Token, 也通常带着Access Token.

4. 依赖方现在可以使用Access Token发送请求到用户信息的端点.

5. 用户信息端点返回用户的声明(claims, 相当于是用户的信息).

 

OpenID Connect的ID Token 和用户信息端点以后在使用Identity Server 4的时候在进行介绍.

 

身份认证

OpenID Connect 会负责身份认证这个动作, 也就是把最终用户登录到系统, 或者判断最终用户是否已经登录了. OpenID Connect会通过一种安全的方式从服务器把身份认证的结果返回给客户端, 这样客户端就可以依赖于它了. 也是因为这个原因, 客户端被称为了依赖方(RP). 这个身份认证的结果就是ID Token.

OpenID Connect身份认证有三个路径(三个流程, flow): Authorization Code 流程Implicit 流程Hybrid 流程.

 

Authorization Code Flow

在Authorization Code 流程里, 一个授权码(Authorization Code)会被返回给客户端. 这个授权码可以被直接用来交换ID Token和Access Token. 该流程也可以在客户端使用授权码兑换Access Token之前对其身份认证. 但是该流程要求客户端的身份认证动作在后台使用client id和secret来获得tokens, 这样就不会把tokens暴露给浏览器或其它可访问浏览器的恶意应用了.

这种流程要求客户端应用可以安全的在它和授权服务器之间维护客户端的secret, 也就是说只适合这样的客户端应用.

它还适合于长时间的访问(通过refresh token).

Authorization Code流程的授权码来自于授权端点, 而所有的tokens都来自于Token端点. 

Authorization Code流程的步骤如下:

  1. 客户端准备身份认证请求, 请求里包含所需的参数

  2. 客户端发送请求到授权服务器

  3. 授权服务器对最终用户进行身份认证

  4. 授权服务器获得最终用户的同意/授权

  5. 授权服务器把最终用户发送回客户端, 同时带着授权码

  6. 客户端使用授权码向Token端点请求一个响应

  7. 客户端接收到响应, 响应的body里面包含着ID Token 和 Access Token

  8. 客户端验证ID Token, 并获得用户的一些身份信息.

 

Implicit Flow

Implicit流程在请求token的时候不需要明确的客户端身份认证, 它使用重定向URI的方式来验证客户端的身份. 因为这一点, refresh token也就无法使用了, 这同样也不适合于长时间有效的access token.

在Implicit流程里, 所有的tokens都来自于授权端点, 而Token端点并没有用到.

该流程主要用于浏览器内的应用, Access Token和ID Token一同被直接返回给客户端. 因为这个原因, 这些tokens也会暴露于最终用户和可以访问该浏览器的其它应用了. 

它并不适合于长时间的访问.

Implicit流程的步骤如下:

  1. 客户端准备身份认证请求, 请求里包含所需的参数

  2. 客户端发送请求到授权服务器

  3. 授权服务器对最终用户进行身份认证

  4. 授权服务器获得最终用户的同意/授权

  5. 授权服务器把最终用户发送回客户端, 同时带着ID Token. 如果也请求了Access Token的话, 那么Access Token也会一同返回.

  6. 客户端验证ID Token, 并获得用户的一些身份信息.

 

Hybrid Flow

Hybrid流程是前两者的混合, 在该流程里, 有一些tokens和授权码来自于授权端点, 而另外一些tokens则来自于Token端点.

该流程允许客户端立即使用ID Token, 并且只需要一次往返即可获得授权码.

这种流程也要求客户端应用可以安全的维护secret.

它也适合于长时间的访问.

Hybrid流程的步骤如下:

  1. 客户端准备身份认证请求, 请求里包含所需的参数

  2. 客户端发送请求到授权服务器

  3. 授权服务器对最终用户进行身份认证

  4. 授权服务器获得最终用户的同意/授权

  5. 授权服务器把最终用户发送回客户端, 同时带着授权码, 根据响应类型的不同, 也可能还带着一个或者多个其它的参数.

  6. 客户端使用授权码向Token端点请求一个响应

  7. 客户端接收到响应, 响应的body里面包含着ID Token 和 Access Token

  8. 客户端验证ID Token, 并获得用户的一些身份信息.

 

三种流程特点的比较:

 Authorization Code FlowImplicit FlowHybrid Flow
所有的tokens都来自于授权端点noyesno
所有的tokens都来自于Token端点yesnono
Tokens对浏览器隐藏yesnono
客户端可以被认证yesnoyes
可以使用Refresh Tokenyesnoyes
只需一次往返通信noyesno
大部分通信都是服务器对服务器yesno看情况

 

返回类型值的比较: 

"response_type" 的值Flow
code Authorization Code Flow
id_token Implicit Flow
id_token token Implicit Flow
code id_token Hybrid Flow
code token Hybrid Flow
code id_token token Hybrid Flow

 

本文就简单介绍这些, OAuth 2.0 和 OpenID Connect 其余涉及到的内容会在后续Identity Server 4的系列文章里介绍.

原文地址https://www.cnblogs.com/cgzl/p/9231219.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

P4301-[CQOI2013]新Nim游戏【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P4301 题目大意 nnn个石头,先手先取走若干堆(不能全取,可以不取),后手取走若干堆(不能全取,可以不取)。然后进行NimNimNim游戏&am…

P2414 NOI2011阿狸的打字机 [AC自动机,dfs序]

阿狸的打字机 题解 题目中给出的字符串就是构建TrieTrieTrie树的顺序.我们将字符串依次读入,每读入一个小写字符就相当于在TrieTrieTrie树当前节点下插入一个小写字符,读入BBB时,就在TrieTrieTrie树中向父节点移动一步.读入PPP的时候,就做一个标记. 然后对这颗TrieTrieTrie树…

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

Ocelot作为基于.net core的API网关,有一个功能是统一验证,它的作用是把没有访问权限的请求挡在API网关外面,而不是到达API网关事端的API时才去验证;之前我有一篇博文Ocelot统一权限验证,作过说明,这篇博文说…

【并查集】小 X 的液体混合

小 X 的液体混合 题目大意: 在一个玻璃瓶里,放入一些液体,某一对液体放在一起会有反应,当某个液体有反应时危险度就会乘2(初值为1),问危险度最大是多少 原题: 解题思路&#xff1…

P4151-[WC2011]最大XOR和路径【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P4151 题目大意 给一个无向图,求一条1∼n1\sim n1∼n的路径使得异或和最大。 解题思路 很强的思路啊(好像去年YPXYPXYPX大爷就讲了反正我也没听懂) 我们可以将路径拆分成三部分&#xff…

Swagger如何访问Ocelot中带权限验证的API

先亮源代码:https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/SwaggerDemo这篇博文不是对asp.net core中使用Swagger作介绍,因为社区博客作了详细说明。今天主要说一下Swagger在Ocelot网关权限验证模式下的访问&a…

初一模拟赛总结(2019.4.13)

成绩: rank是有算其他dalaodalaodalao的 注: 这次好像是因为OJ有问题,导致一些AC代码变(bei)W(zhi)A(cai)了 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3…

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端,可以私有化部署: etcd-workbench 开源地址:https://github.com/tzfun/etcd-workbench Gitee地址:https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…

深度学习中反向传播算法简单推导笔记

反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)W(1)xb(1)z^{(1)} W^{(1)}xb^{(1)}z(1)W(1)xb(1) a(1)σ(z(1))a^{(1)} \sigma(z^{(1)})a(1)σ(z(1)) z(2)W(2)a(1)b(2)z^{(2)}W^{(2)}a^{(1)}b^{(2)}z(2)W(2)a(1)b(2) a(2)σ(z(2))a^{(2)} \sigm…

EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

写过上一篇关于EF Core中读写分离最佳实践方式后,虽然在一定程度上改善了问题,但是在评论中有的指出更换到从数据库。那么接下来要进行插入此时又要切换到主数据库,同时有的指出是否可以进行底层无感知操作,这确实是个问题&#x…

【图论】【Kosaraju】刻录光盘(ssl 2344)

刻录光盘 ssl 2344 题目大意: 求连通块 原题: 题目描述 在JSOI2005夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习。组委会觉得这个主意不错!可是组…

P4158-[SCOI2009]粉刷匠【dp,背包】

正题 https://www.luogu.com.cn/problem/P4158 题目大意 nnn个墙长度为mmm,每次可以粉刷一堵墙的连续一段区间,粉刷过的不能再粉刷。给出每个位置应该粉刷的颜色,然后求TTT次可以粉刷正确多少个位置。 解题思路 首先我们对于第iii堵墙处理出…

一文搞清到底什么是 .NET?

现在各种 .NET 满天飞,别说新手了,连我这样的老手都差点被绕进去。到底什么是 .NET 呢?通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? 这篇文章好长呀,不知道你看完了没有,其实…

P4552-[Poetize6]IncDec Sequence【差分】

正题 题目链接:https://www.luogu.com.cn/problem/P4552 题目大意 给出nnn个数,每次可以选择一个区间加一或减一,求最少操作使得所有数相等,并且求可能的最终序列个数。 解题思路 在差分数组上操作,那么操作变为将差分数组上一…

练习利用LSTM实现手写数字分类任务

练习利用LSTM实现手写数字分类任务 MNIST数据集中图片大小为28*28. 按照行进行展开成28维的特征向量。 考虑到这28个的向量之间存在着顺序依赖关系,我们可以将他们看成是一个长为28的输入序列,将其输入到LSTM中,LSTM可以从中提取到序列特征…

【图论】最短路上的统计(ssl 1500)

最短路上的统计 ssl 1500 题目大意: 求一个图中,从a到b的所有最短路所经过的点数之和 原题: 题目描述 一个无向图上,没有自环,所有边的权值均为1,对于一个点对(a,b),我们要把所…

Service Mesh新成员:Consul 1.2

本文译自 HashiCorp 官网关于 Consul 1.2 支持 Service Mesh 发布的博客文章。原文链接:https://www.hashicorp.com/blog/consul-1-2-service-mesh作者:Mitchell Hashimoto 翻译:董干 转载自:https://blog.idevfun.io/consul-1-2-…

P4564-[CTSC2018]假面【期望dp】

正题 题目大意:https://www.luogu.com.cn/problem/P4564 题目大意 nnn个人第iii个有mim_imi​点血,每次有操作 有ppp的概率对一个人造成111点伤害(如果死了就不算,ppp每次都不同)给出若干个人,对里面存活的人随机选择…

VAE(变分自编码器)学习笔记

VAE学习笔记 普通的编码器可以将图像这类信息编码成为特征向量. 但通常这些特征向量不具有空间上的连续性. VAE(变分自编码器)可以将图像信息编码成为具有空间连续性的特征向量. 方法是向编码器和解码器中加入统计信息,即特征向量代表的的是一个高斯分布,强迫特征向量服从高…

小 X 的 AK 计划

小 X 的 AK 计划 题目大意: 有n个点,到一个点(时间为距离)并花一些时间可以A掉此点,问最多可以A多少个点 原题: 解题思路: 先按位置从小到大排序,然后到每一个点并A掉的时间加在…