要用Identity Server 4 -- OAuth 2.0 超级简介

OAuth 2.0 简介

OAuth有一些定义:

OAuth 2.0是一个委托协议, 它可以让那些控制资源的人允许某个应用以代表他们来访问他们控制的资源, 注意是代表这些人, 而不是假冒或模仿这些人. 这个应用从资源的所有者那里获得到授权(Authorization)access token, 随后就可以使用这个access token来访问资源.

(这里提到的假冒或模仿就是指在客户端复制一份用户名和密码,从而获取相应的权限)。

OAuth 2.0是一个开放的协议, 它允许使用简单和标准的方法从Web, 移动或桌面应用来进行安全的授权(Authorization).

 

从这些定义可以看出来, OAuth2 是关于授权(Authorization)的,  客户端应用可以请求access token, 使用这个token就可以访问API资源了.

因为有很多种类客户端应用的存在, 例如ASP.NET Core MVC, Angular, WPF 等等, 它们都是不同的应用类型, 所以, OAuth2 定义了不同类型的客户端应用应该如何安全的完成授权. OAuth2标准还定义了一些端点, 并且定义了针对不同类型的客户端应用如何使用这些端点.

Identity Server 4 和 Azure AD 都实现了OAuth 2.0 标准.

但是上面提到的access token只能用来访问资源, 它无法被用来登录客户端应用. 登录这种操作叫做认证/身份验证(Authentication), 而OpenID Connect则可以完成这项工作.

 

OpenID Connect 简介

OpenID Connect是建立在OAuth2协议上的一个简单的身份标识层, 所以OpenID Connect兼容OAuth2. 

使用OpenID Connect, 客户端应用可以请求一个叫identity token的token, 它会和access token一同返回给客户端应用. 这个identity token就可以被用来登录客户端应用程序, 而这个客户端应用还可以使用access token来访问API资源.

OpenID Connect还定义了一个UserInfo端点, (OAuth2定义了Authorization端点和Token端点)它允许客户端应用获取用户的额外信息. 

此外它还定义了不同类型的应用如何从身份识别提供商(IDP)安全的获取这些token.

 

综上, OpenID Connect是更高级的协议, 它扩展并替代了OAuth2. 尽管现在我们经常说我们在使用OAuth2来保护API, 其实更准确的说, 大多数情况下, 我们使用的是OpenID Connect.

 

如果到现在还是不明白OAuth2和OpenID Connect也没关系, 这不是几句话就能描述清楚的东西. 本文我进一步介绍OAuth 2.0.

 

OAuth 2.0 进一步介绍

OAuth2的目标就是让客户端应用可以代表资源所有者(通常是用户)来访问被保护的资源:

640?wx_fmt=jpeg

  • 这里的资源所有者(Resource Owner), 他拥有访问API资源的权限, 并且他还可以委派权限(delegate)给其他应用来访问API. 资源所有者通常是可以使用浏览器的人.

  • 被保护的资源(Protected Resource)就是资源所有者拥有权限去访问的组件, 它可以是很多种形式的, 但是web API的形式还是最常见的.

  • 客户端(Client)应用就是代表资源所有者访问被保护资源的一个软件. 注意它既不是指浏览器, 也不是指给你钱让你开发软件的人. 在OAuth2里面, 它是指被保护的API资源的消费者.

 

委拖/委派权限

前面提到OAuth2里面, 最终用户可以委派他的一部分权限给客户端应用来代表最终用户来访问被保护的资源. 但是要完成这件事, 还需要一个桥梁来连接客户端应用和被保护资源. 这个组件叫做授权服务器(Authorization Server, AS). 这个授权服务器也许就是资源服务器, 但是大多数情况下它们是不同的服务器.

授权服务器(AS)是被受保护的资源所信任的, 它可以发行具有特定目的的安全凭据给客户端应用, 这个凭据叫做OAuth的 access token.

想要获得access token, 客户端应用首先要把资源所有者发送给授权服务器

640?wx_fmt=png

首先客户端需要获得权限, 它可能有两种方式来获得权限: 可以从资源所有者那里直接获得权限, 也可以让授权服务器作为中介, 从授权服务器那里间接的获得权限. (上面这个图中描述的是从资源授权者直接获得权限的流程).

如果使用授权服务器作为中介的话, 客户端需要把资源所有者发送到授权服务器(可以理解为最终用户使用的浏览器被重定向到了授权服务器), 然后资源所有者在这可以对客户端应用进行授权. 

这时资源所有者要通过身份认证进入授权服务器, 通常还会有一个是否同意授权客户端应用请求的选项, 点击同意后就授权了. 而从客户端应用的角度讲呢, 它可以向资源所有者请求他一部分的功能和范围(scope), 在将来, 资源所有者可能会逐渐减少它所拥有的功能和范围.

到这里, 上面写的这个动作/东西叫做授权(authorization grant).

一旦执行了授权动作也就是客户端得到了授权(这个授权是一个可以代表资源所有者权限的凭据), 客户端便可以从授权服务器请求access token了. 这个access token就可以被用来访问被保护的资源了.

下图是使用授权服务器作为中介的流程图, 除了授权, 其它部分和上图表达的都是一个意思:

640?wx_fmt=png

 

授权 Authorization Grant

授权 (authorization grant) 是一个代表着资源所有者权限的凭据, 它可以被客户端应用来获取access token. OAuth2里面定义了4种类型的授权, 分别是: auhtorization codeimplicitresource owner password credentialsclient credentials. OAuth2还定义了一个扩展机制以便定义其它的授权类型. 

用一句话描述就是, 授权(Authorization Grant)就是获取token的方法.

1. Authorization Code

Authorization Code是使用授权服务器作为客户端和资源所有者的中介来获取的. 所以这里不是采用直接从资源所有者获得授权的方式, 而是采用授权服务器作为中介的方式. 在授权服务器把资源所有者送回到(重定向)客户端的时候带着这个临时的凭据: authorization code (我暂时叫它授权码吧), 它就代表着资源所有者委托给客户端应用的权限.

Authorization code在安全方面有一些重要的优点: 可以对客户端应用进行身份认证; access token是直接发送到客户端应用的, 不经过资源所有者的浏览器, 所以不会暴露access token给外界, 包括资源所有者.

 

2. Implicit

Implicit, 我叫它隐式授权吧. 它是Authorization Code的一个简化版本, 它针对浏览器内的客户端应用(例如js, angular的应用)进行了优化. 在implicit流程里, 没有给客户端发送授权码(authorization code), 而是直接给它发送了access token. 之所以叫这种授权类型implicit, 是因为流程里并没有发行任何中间凭据.

在implicit流程里发行access token的时候, 授权服务器并没有对客户端应用进行身份认证. 某些情况下, 客户端的身份可以通过带着access token重定向回客户端的URI来验证. acces token可能会暴露给任何使用该浏览器的人或者应用.

Implicit授权确实可以提高浏览器内应用的响应性和效率, 毕竟它减少了来回往返的次数. 但是方便可能会带来风险, 建议如果可以的话尽量使用Authorization Code, 当然这个需要自己去权衡.

 

3. Resource Owner Password Credentials

Resource Owner Password Credentials, 资源所有者密码凭据. 顾名思义, 可以直接使用密码凭据(用户名和密码)作为授权来获得access token. 只有当资源所有者和客户端之间高度信任的时候并且其它授权方式不可用的时候才可以使用这种授权方式.

这里资源所有者的凭据只应该用于一次请求并用于交换access token. 这种授权方式可以让客户端免于存储资源所有者的凭据(如果以后还需要使用的话), 通过交换一个长期有效的access token或refresh token都可以达到这种效果.

 

4. Client Credentials

Client Credentials. 有时候, 资源或者叫资源服务器并不属于某个最终用户, 也就是没有资源所有者对该资源负责. 但是客户端应用肯定还是要访问这些资源, 这时候就只能使用Client Credentials这种授权方式了.

 

OAuth 2.0 的角色和组件

OAuth2的4个角色前面已经介绍过, 分别是: 资源所有者 Resource Owner, 客户端 Client, 被保护资源 Protected Resource, 和 授权服务器 Authorization Server.

而OAuth2的组件, 前面也都有提到过, 它们是: Access TokenRefresh Token 和 Scope (范围).

下面简单介绍下这几个组件.

Access Token: 有时候只被叫做token, 它是用来访问被保护资源的凭据. 它是一个字符串, 它代表了给客户颁发的授权, 也就是委托给客户的权限. OAuth2本身并没有对access token的格式或内容进行定义. 但是access token里面要描述出资源所有者授予的访问权限的范围和持续时间.

Access Token 通常对客户端应用是不透明的, 也就是说客户端无需去查看access token. 客户端的任务就是把它展示给被保护的资源. 其实access token在整个OAuth2系统里对任何角色都是不透明的, 授权服务器的任务只是发行token, 而被保护资源的任务是验证token. 但是它们都必须理解access token的构成, 并知道access token代表了什么. 而客户端对于access token应该是完全健忘的.

Scopes: OAuth2的scope表示被保护资源那里的一套权限. 在OAuth2里面, scope用区分大小写的字符串表示, 可以用空格作为分隔符来表示多个scope. 这些字符串由授权服务器来定义. 而scope字符串的格式和结构在OAuth2里并没有定义.

Scope对于限制客户端应用的访问权限有很重要的作用. 客户端应用可以请求一些scopes, 而授权服务器可以允许资源所有者授权或者拒绝特定的scopes. Scope还具有叠加性.

Refresh Token: Refresh Token是用来获得Access Token的凭据. 和acces token差不多, refresh token也是由授权服务器发行给客户端应用的, 客户端不知道也不关心refresh token里面有啥. 但与access token不同的是, refresh token不会被发送给被保护的资源. 客户端是用refresh token来请求新的access token (尤其是当现在的access token过期或者失效时), 但这个过程就不需要资源所有者的参与了. Refresh Token是可选的, 授权服务器会酌情发行refresh token, 如果需要的话, refresh token是在发行access token一同返回的.

此外refresh token还具备让客户端应用逐渐降低访问权限的能力.

通过refresh token来取得新的access token的流程如下:

640?wx_fmt=png

另外一张彩色图:

640?wx_fmt=png

这张彩图的中文意思是: 客户端使用当前access token访问被保护资源的时候, access token失效或者过期了, 这是从被保护资源返回了一个错误响应; 然后客户端使用refresh token向授权服务器请求了一个新的access token; 得到新的access token后, 客户端使用新的access token请求被保护资源, 这时资源就可以被正常的返回给客户端了.

 

OAuth 2.0的端点

OAuth2定义了一套端点(Endpoint), 端点就是web服务器的一个访问路径URI.

OAuth2定义的端点有授权端点Token端点, 它们都在授权服务器上.

OAuth2没有定义这些端点URI应该如何被发现和文档的结构.

授权端点(authorization endpoint)是用来和资源所有者交互的, 资源所有者在这里进行登录(身份认证), 然后通过该端点可以对客户端进行授权(authorization grant). 授权服务器首先要验证资源所有者的身份, 但是验证的方式并不在OAuth2的协议范围内.

Token端点(token endpoint), 客户端通过向token端点展示它的授权(auhtorization grant)或refresh token来获取access token. 除了implicit之外所有的授权类型都需要使用该端点, 因为implicit的access token是直接发行的.

 

本篇文章先到这. 下篇文章再简单介绍一下OpenId Connect.

那四种授权类型具体的详细流程将在介绍Identity Server 4的时候一同介绍.

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

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

640?wx_fmt=jpeg

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

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

相关文章

清明梦超能力者黄YY[树链剖分+扫描线,线段树合并]

清明梦超能力者黄YY 题目连接 https://www.nowcoder.com/acm/contest/206/I 暂时有两种做法. 算法一 涉及:树链剖分,扫描线 在一个线段的情况下,我们可以把一个染色区间拆成左端点处增加事件,右端点处删除事件. 维护一颗权值线段树. 这样,端点从小到大扫描时,遇到增加事件…

初一模拟赛总结(3.23)

成绩: rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf300300300100100100100100100100100100000222wjjwjjwjj290290290100100100100100100909090000333hkyhkyhky270270270100100100100100100707070000444fyfyfy24024024010010010010…

CF1110E-Magic Stones【结论题,差分】

正题 题目链接:https://www.luogu.com.cn/problem/CF1110E 题目大意 给出一个序列cic_ici​和一个序列tit_iti​。每次操作可以将cici−1ci1−ci(1<i<n)c_ic_{i-1}c_{i1}-c_i(1<i<n)ci​ci−1​ci1​−ci​(1<i<n) 解题思路 首先要求c1t1,cntnc_1t_1,c_nt…

好代码是管出来的——C#的代码规范

代码是软件开发过程的产物&#xff0c;代码的作用是通过编译器编译后运行&#xff0c;达到预期的效果(功能、稳定性、安全性等等)&#xff0c;而另外一个重要作用是给人阅读。对于机器来说只要代码正确就能够正确的运行程序&#xff0c;但是人不同&#xff0c;如果代码编写混乱…

【图论】【高精】产生数(ssl 1021/ luogu 1037)

产生数 ssl 1021 luogu 1037 题目大意&#xff1a; 有一个数&#xff0c;可以使某些数字变成相对应的数字&#xff0c;问有多少种变法 原题&#xff1a; Description 给出一个整数 n&#xff08;n<10^30) 和 k 个变换规则&#xff08;k<15&#xff09;。   规则…

P3224-[HNOI2012]永无乡【平衡树,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P3224 题目大意 nnn个点&#xff0c;每次可以连接两个点和询问一个点所在联通块中第kkk大的数。 解题思路 我们发现可以启发式合并&#xff0c;对于每个联通块维护一个线段树&#xff0c;然后每次合并时将小的暴力丢入大的平…

牛客国庆集训派对Day6

牛客国庆集训派对Day6 以下是我个人题解,出题人题解附带在最后 A.Birthday 费用流裸题,只要注意到135...2k−1k2135...2k-1 k^2135...2k−1k2即可已做这道题了. 其他的地方连边都很方便.每一个区域向汇点连很多条容量为111的边,但费用分别是1,3,5,...,2k−11,3,5,...,2k-11…

.NET Core微服务之基于IdentityServer建立授权与验证服务(续)

上一篇《.NET Core微服务之基于IdentityServer建立授权与验证服务》我们基于IdentityServer4建立了一个AuthorizationServer&#xff0c;并且继承了QuickStartUI&#xff0c;能够成功获取Token了。这一篇我们了解下如何集成API Service和MVC Web Application。一、集成API Serv…

P4587-[FJOI2016]神秘数【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P4587 题目大意 nnn个数&#xff0c;每次选择一个区间&#xff0c;然后询问这个区间的子集和所不能表示的最小的正整数。 解题思路 假设我们从小到大加入数字&#xff0c;我们发现如果这个数不是111显然这个区间内至少有一个…

【图论】【Floyed】舞会邀请(CODE[VS] 2604)

舞会邀请 CODE[VS] 2604 题目大意&#xff1a; Smart要叫一些人开Party&#xff0c;每个人可以通知一部分人&#xff0c;Smart去通知一些人&#xff0c;再让这些人去通知其他人&#xff0c;问Smart最少通知几个人&#xff0c;可以使全部人都被通知到 原题&#xff1a; 题目…

ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务

在大部分程序中一般都会需要用到后台任务&#xff0c; 比如定时更新缓存或更新某些状态。一、应用场景以调用微信公众号的Api为例&#xff0c; 经常会用到access_token&#xff0c;官方文档这样描述&#xff1a;“是公众号的全局唯一接口调用凭据&#xff0c;有效期目前为2个小…

【Floyed】工厂的烦恼(ssl 1762)

工厂的烦恼 ssl 1762 题目大意&#xff1a; 求一个图中最长的路线的长度 原题&#xff1a; Description 某工厂发现厂里的机器在生产产品时要消耗大量的原材料&#xff0c;也就是说&#xff0c;有大量的原材料变成了废物。因此厂里想找出消耗原材料最大的一条生产线路进行…

P3899-[湖南集训]谈笑风生【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P3899 题目大意 给出nnn个点的一棵有根树&#xff0c;每次询问一个(p,k)(p,k)(p,k)&#xff0c;求有多少个点对(b,c)(b,c)(b,c)满足 ppp和bbb是ccc的祖先bbb与ppp的距离不超过kkk 蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤…

好代码是管出来的——.Net中的代码规范工具及使用

上一篇文章好代码是管出来的——C#的代码规范介绍了编码标准中一些常用的工具&#xff0c;本篇就具体来介绍如何使用它们来完成代码管理。  本文主要内容有&#xff1a;Roslyn简介开发基于Roslyn的代码分析器常用的基于Roslyn的代码分析器在.Net Framework项目中使用代码分析…

NCPC2018 D.Delivery Delays[二分答案+DP check]

Delivery Delays 题意 100010001000个点,500050005000条边的无向图,披萨店在111号店.100010001000份披萨订单,每个订单有下单时间,送达地点,披萨制作出来的时间.你是快递员初始在111号点,每次可以拿无穷多披萨,送完以后返回111号点继续送,送餐的时候要求按照下单顺序送达,求等…

P6046-纯粹容器【数学期望,组合数】

正题 题目链接:https://www.luogu.com.cn/problem/P6046 题目大意 nnn个数&#xff0c;每次选择两个相邻的数删除小的那个&#xff0c;求每个数期望存活轮数。 解题思路 相当于一条链每次缩掉一条边&#xff0c;我们发现其实每个点只需要考虑左右第一个比它大的就好了。定义…

【dfs】病毒(jzoj 1284)

病毒 题目大意&#xff1a; 有n&#xff08;1<n<1000&#xff09;头奶牛&#xff0c;d&#xff08;1<d<15&#xff09;种病毒&#xff0c;每头奶牛身上有可能有很多种病毒病毒&#xff0c;每头奶牛挤出的牛奶是混在一起放的&#xff0c;问最多可以挤多少头奶牛的…

探讨.NET Core的未来

本文要点与传统的.NET Framework相比&#xff0c;.NET Core平台具有显著的性能优势。.NET Core在Microsoft平台之外也广为采用&#xff0c;并受益于强大的社区参与。.NET Core在设计上采用以服务器为中心&#xff0c;而非聚焦于Windows。.NET Core开发受益于这种设计。.NET Cor…

HDU5985 Lucky Conins 概率题

Lucky Conins 题意 最多共101010种硬币,所有的硬币之和不超过100000100000100000,每次将所有的硬币抛出,第iii中硬币正面朝上的概率为pip_ipi​,将反面朝上的硬币移除掉.直至最后剩一种硬币或没有硬币则停止.若最后剩余一种硬币,则称这种硬币是幸运的,求每种硬币的幸运概率. …

P6619-[省选联考2020A/B卷]冰火战士【树状数组二分】

正题 题目链接:https://www.luogu.com.cn/problem/P6619 题目大意 有火系战士和冰系战士有一个温度和一个战斗力&#xff0c;每次加入或删除一个战士&#xff0c;要求一个最大的kkk使得温度不低于kkk的火系战士战斗力和温度不高于kkk的冰系战士战斗力和的最小值最大。 解题思…