1.传统架构的授权认证

  传统应用架构,用户使用账号密码登录后,可以使用前端cookie存储登录状态,也可以使用后端session方式存储登录状态,小应用这么做其实很高效实用,当应用需要横向扩展时,就需要共享登录状态,这时候session的基于asp.net state这种当前服务器进程方式存储就失效了,需要换成sqlserver或者redis作为session共享存储,这些都不是问题,这些前提都是单体应用架构的方案,但是在微服务架构里,服务拆分零散且前后端分离,后端以API方式提供服务的前提下,这种认证授权方式用不了拉,这时候就需要一个安全的、跨分布式的、高性能的认证授权方案来解决。 

  这些年围绕着授权鉴权(authorization)和身份验证(authentication)诞生了很多规范和协议。这里只讨论最主流的最新的规范和协议:OAuth2.0、OpenID Connect、JWT。8

2.OAuth 2.0

  OAuth 2.0是关于授权鉴权的,一句话解释“OAuth 2.0是一种框架,其中服务的用户可以允许第三方应用程序访问他/她在服务中托管的数据,而无需向应用程序透露他/她的凭据”。

  说一下Oauth2.0相关的名词:

  • Resource Owner:资源所有者,就是某个应用的用户;
  • Client:客户端,一个想要用这个资源用户的名义去做一些事情的应用”;
  • Authorization Server:授权服务,前提是用户信任这个服务并且该服务拥有用户信息,用于颁发令牌给应用;
  • Resource Server: 一个应用(API或者服务);
  • Redirect URI: 一个网址URL,当Resource Owner在Authorization Server上授权了Client后,Authorization Server将会把Resource Owner重定向到的地方,也称“Callback URL”;
  • Authorization Code: 用户授权给client后通过RedirectUrl回调回去携带的code,用于client通过客户端模式向授权服务换取token;
  • Access Token: Client和Resource Server交互所使用的令牌,携带的访问权限范围,是你授权时通过勾选给client的,然后client拿着这个用户名义的token就可以访问你的资源了; 一般使用的是JWT格式;
  • Response Type: Client希望从Authorization Server收到的信息的类型,最常见的Response Type是code,也就是Client希望收到一个Authorization Code,也有Implicit隐藏式,password密码模式,Client Credential客户端凭证模式。  

  下面说一下几种常用授权类型的实际交互是怎么样的

(1) 授权码模式Authorization Code

  

(2)Implicit隐藏式

  这种模式,跳过获取code的步骤,在客户端重定向到授权服务时,讲responseType换成token。

(3)password密码模式

  这种是啥呢,需要用户非常非常信任client的时候,才使用这种模式,需要用户在clinet上输入账号密码,client拿着用户的账号密码去授权服务获取access token。

(4)Client Credential客户端凭证模式

  这是client与client之间的通信,与用户没啥关系,这种用于,流程是,A客户端使用clientId和secret通过授权服务,获取访问B客户端的token。我们实战中,是业务系统,在中台认证中心里获取一个长期的可以访问中台某些服务的token,业务服务直接通信中台服务,于用户无关。

3.OpenID Connect

  OpenID Connect实际上就是对于client来说,在OAuth 2协议上完善了身份认证的东西,并不是说Oauth 2.0没有提供认证能力,只是对于client来说,没有知道用户的认证过程,没有拿到用户认证信息而已,OIDC就是让OAuth把认证结果也告诉client,让client也知道了用户是认证过的。这样在授权码过程中如下图:

  

 HTTP/1.1 302 Found
Location: https://server.example.com/authorize?
response_type=code
&scope=openid%20profile%20email
&client_id=s6BhdRkqt3
&state=af0dasd
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb

在scope中增加了openid

 HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache {
"access_token": "dasdqwdqd",
"token_type": "Bearer",
"refresh_token": "casdqwfw",
"expires_in": 3600,
"id_token": "dsadwqdqdqwdqV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
QyHE5lcMiKPXfEIQILVq0pcgqeqgeqwhethrDSAdqwwqrt43t3"
}

  在返回的时候增加了id_token。

  那么问题来了,OAouth2.0 给客户端办法的access token中的Payload中是可以自定义的,并且也可以防篡改,直接把认证的身份信息自定义里多好啊。?或者说,通过access_token去oidc提供的一个endpoint(get/userinfo)去请求用户信息?

  原因以下几点:

  1)payload里可是明文传输的,增加了传输带宽,也增加了用户信息泄露的风险;

  2)access_token本身定义就是授权访问令牌,不关心用户信息,只关心是否能访问,功能耦合;

  3)通过endpoint请求用户信息,增加了不少额外的API开销。

下一节,我们会大至说一下.net core服务中基于OAuth2.0和OpenId Connect实现的框架 identiy server 4

  

  

微服务系列之授权认证(一) OAuth 2.0 和 OpenID Connect的更多相关文章

  1. 微服务系列之授权认证(二) identity server 4

    1.简介 IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证授权框架. 官方文档:https://ident ...

  2. 微服务系列之授权认证(三) JWT

    1.JWT简介 官方定义:JWT是JSON Web Token的缩写,JSON Web Token是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,可以将各方之间的信息作为JSON ...

  3. 使用 IdentityServer4 实现 OAuth 2.0 与 OpenID Connect 服务

    IdentityServer4 是 ASP.NET Core 的一个包含 OIDC 和 OAuth 2.0 协议的框架.最近的关注点在 ABP 上,默认 ABP 也集成 IdentityServer4 ...

  4. ASP.NET 中OAUTH 2.0 及OPENID CONNECT的介绍

        了解以下内容对ASP.NET 5中的验证中间件应用有很大帮助! OAUTH2是目前很多大型网站都使用的对外提供开放资源接口的应用标准,比入taobao\alipay\腾讯\豆瓣等.它和目前的另 ...

  5. 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足

    Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...

  6. 微服务系列(二):使用 API 网关构建微服务

    编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨:微服务架构是如何影响客户端到服务端的通信,并提出一种使用 API 网关的方法. 作者介绍:Chris Richardso ...

  7. 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)

    微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...

  8. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  9. Spring Cloud微服务系列文,服务调用框架Feign

    之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON.    这种 ...

随机推荐

  1. MYSQL的事务和索引

    事务 什么是事务 事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行 MySQL事务处理只支持InnoDB和BDB数据表类型 事务的ACID原则 ...

  2. EasyExcel导出添加批注

    直接看代码.根据个人需要做改动 注:POI也可以做批注,文章链接https://www.cnblogs.com/qq1445496485/p/15622664.html /** * 导出(批注) * ...

  3. NC16564 [NOIP2012]借教室

    NC16564 [NOIP2012]借教室 题目 题目描述 ​ 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借 ...

  4. 分布式事务(Seata) 四大模式详解

    前言 在上一节中我们讲解了,关于分布式事务和seata的基本介绍和使用,感兴趣的小伙伴可以回顾一下<别再说你不知道分布式事务了!> 最后小农也说了,下期会带给大家关于Seata中关于sea ...

  5. CMU15445 (Fall 2019) 之 Project#3 - Query Execution 详解

    前言 经过前面两个实验的铺垫,终于到了给数据库系统添加执行查询计划功能的时候了.给定一条 SQL 语句,我们可以将其中的操作符组织为一棵树,树中的每一个父节点都能从子节点获取 tuple 并处理成操作 ...

  6. Note -「Dsu On Tree」学习笔记

    前置芝士 树连剖分及其思想,以及优化时间复杂度的原理. 讲个笑话这个东西其实和 Dsu(并查集)没什么关系. 算法本身 Dsu On Tree,一下简称 DOT,常用于解决子树间的信息合并问题. 其实 ...

  7. Trie树模板2

    Trie数模板2 problem 这道题然后我们求最大异或对,我们很容易想出来 \(O(n^2)\) 的做法,两层循环遍历搞定 然后我们知道这样是肯定是肯定过不了的,我们考虑用字典树解决,然后我们来看 ...

  8. 第十八天python3 序列化和反序列化

    思考: 内存中的字典.列表.集合以及各种对象,如何保存到一个文件中? 如果是自己定义的类的实例,如何保存到一个文件中? 如何从文件中读取数据,并让它们在内存中再次变成自己对应的类的实例? 要设计一套协 ...

  9. 字符输出流_Writer类&FileWrite类介绍和字符输出流的基本使用_写出单个字符到文件

    字符输出流_Writer类&FileWrite类介绍 java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类 共性抽象方法: void write(int c) ...

  10. c语言中的gets和fgets的使用差别

    gets和fgets的差别 2022年6月30日 #include<stdio.h> #include<string.h> #define STLEN 8 int main(i ...