OpenID Connect Core 1.0(七)使用混合流验证
3.3 使用混合流验证(Authentication using the Hybrid Flow)
本节描述如何使用混合流执行验证。当使用混合流(Hybrid Flow)时一些令牌从授权端点返回,另一些则从令牌端点返回。混合流中返回令牌的机制在OAuth 2.0多响应类型编码实践中指定[OAuth. responses]。
3.3.1 混合流程的步骤(Hybrid Flow Steps)
混合流程遵循以下步骤:
1、客户准备一个包含所需的验证请求的请求参数。
2、客户端发送请求到授权服务器。
3、授权服务器验证用户。
4、授权服务器获得用户同意/授权。
5、授权服务器将终端用户发送给回客户端一个授权码,根据响应类型,返回一个或多个额外的参数。
6、客户端使用的这个授权码到令牌终结点请求响应。
7、客户端接收到包含一个ID Token和Access Token的body响应。
8、客户端验证ID Token和检索终端用户的 Subject 标识符。
3.3.2 授权终结点(Authorization Endpoint)
当使用混合流程,使用授权的终结点,是以3.1.2节定义的授权码流程的一样的方式使用授权的终结点,除了在本节中指定的差异。
3.3.2.1 验证请求(Authentication Request)
验证请求是由3.1.2.1节中定义 ,除了以下使用的验证请求参数:
response_type
必需的。确定要使用的授权处理流的OAuth 2.0响应类型值,包括从使用的端点返回的参数。当使用混合流程,此值是“code id_token” ,“code token”,或“code id_token token”。这些值定义在 OAuth 2.0 Multiple Response Type Encoding Practices [OAuth.Responses]。
下面是一个使用混合流的非规范示例请求,该混合流将由用户代理发送到授权服务器,以响应客户机相应的HTTP 302重定向响应(换行仅为显示):
GET /authorize?
response_type=code%20id_token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile%20email
&nonce=n-0S6_WzA2Mj
&state=af0ifjsldkj HTTP/1.1
Host: server.example.com
3.3.2.2 验证请求验证(Authentication Request Validation)
当使用混合流程,验证请求的验证方式与第3.1.2.2节中定义的授权代码流相同。
3.3.2.3 授权服务器验证用户(Authorization Server Authenticates End-User)
当使用混合流程,终端用户身份验证的执行方式与第3.1.2.3节中定义的授权代码流相同。
3.3.2.4授权服务器获得用户同意/授权(Authorization Server Obtains End-User Consent/Authorization)
当使用混合流程,最终用户同意的获得方式与第3.1.2.4节中定义的授权代码流相同。
3.3.2.5成功的验证响应(Successful Authentication Response)
当使用混合流程,以隐式流程3.2.2.5节中定义的同样方式验证响应,除了在本节中指定的差异。
这些授权终结点结果的使用方式如下:
access_token
OAuth 2.0Access Token。当 response_type 使用的值是 code token,或 code id_token token返回。(token_type 值也在同样的情况下返回。)
id_token
ID Token。当 response_type 使用的值是code id_token 或 code id_token token时返回。
code
授权码。当使用混合流时,其总是返回。
下面是一个非规范化成功的响应使用混合流程的例子(换行仅为显示):
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
code=SplxlOBeZQQYbYS6WxSbIA
&id_token=eyJ0 ... NiJ9.eyJ1c ... I6IjIifX0.DeWt4Qu ... ZXso
&state=af0ifjsldkj
3.3.2.6 验证错误响应(Authentication Error Response)
当使用混合流程,授权错误响应的方式与第3.1.2.6节中定义的授权代码流相同,除了在本节中指定的差异。
如果最终用户拒绝请求或最终用户身份验证失败,授权服务器必须在重定向URI的片段组件中返回错误授权响应,OAuth 2.0 (RFC6749) 4.2.2.1中定义和 OAuth 2.0多个响应类型编码实践 (OAuth.Responses) 中定义,除非指定不同的响应模式。
3.3.2.7 重定向URI片段处理(Redirect URI Fragment Handling)
当使用混合流程,重定向的URI参数处理片段与隐式流程3.2.2.7部分中定义请求相同。同时参照 15.5.3节中URI片段处理实现注意事项。
3.3.2.8 身份响应验证(Authentication Response Validation)
当使用混合流程,客户端必须验证如下响应:
1、验证的响应符合[OAuth.Responses]的第五节 。
2、遵循RFC 6749的验证规则,尤其是4.2.2和10.12部分。
3、遵循3.3.2.12验证规则,验证ID Token ,response_type 使用的值是“code id_token” 或“code id_token token”。
4、遵循3.3.2.9部分验证规则,验证IAccess Token ,当 response_type 使用的值“code token”或“code id_token token”。
5、遵循3.3.2.10部分规则,验证授权码,当 response_type使用的值是“code id_token ”或“code id_token”。
3.3.2.9 Access Token验证(Access Token Validation)
当使用混合流时,从授权终结点返回的Access Token将以与隐式流相同的方式进行验证,如3.2.2.9节中定义的那样。
3.3.2.10 授权码验证(Authorization Code Validation)
要使用ID Token验证授权结点发出的授权码,客户端应该执行以下操作:
1、用JWA 中为ID Token的JOSE报头的alg报头参数指定的哈希算法对代码的ASCII表示的八字节进行哈希。例如,如果alg是RS256,则使用的哈希算法是SHA-256。
2、取散列的最左边一半,然后对其进行base64url编码。
3. 如果ID Token中存在c_hash,则ID Token中的c_hash值必须与前一步中生成的值匹配。
3.3.2.11 ID Token
ID Token的内容如第2节所述。当使用混合流时,以下ID Token声明的这些附加要求适用于授权终结点返回的ID Token:
nonce
nonce 声明是必需。
at_hash
Access Token的哈希值。它的值是access_token值的ASCII表示的最左半哈希的base64url编码,其中使用的哈希算法是ID Token的JOSE头的alg头参数中使用的哈希算法。例如,如果alg是RS256,那么用SHA-256散列access_token值,然后取最左边的128位,base64url对其进行编码。at_hash值是一个区分大小写的字符串。
如果ID Token使用access_token值从授权终结点发出,则需要使用access_token,这是response_type值代码id_token的情况;否则,它是可选的。
c_hash
Code 的哈希值。它的值是Code的ASCII表示的最左半哈希的base64url编码,其中使用的哈希算法是ID Token的JOSE报头的alg报头参数中使用的哈希算法。例如,如果alg是HS512,用SHA-512对Code进行哈希,然后取最左边的256位,base64url对其进行编码。c_hash值是一个区分大小写的字符串。
如果ID Token是通过从授权终结点发出的Code,对于response_type值code id_token和code id_token来说,这是必需的;否则,它是可选的。
3.3.2.12 ID Token验证(ID Token Validation)
在使用混合流时,必须以与隐式流相同的方式验证从授权终结点返回的ID Token的内容,如3.2.2.11节中定义的那样。
3.3.3 令牌终结点(Token Endpoint)
在使用混合流时,令牌终结点的使用方式与第3.1.3节中定义的授权代码流相同,但本节中指定的差异除外。
3.3.3.1 令牌的请求(Token Request)
当使用混合流时,令牌请求的方式与授权代码流的方式相同,如3.1.3.1节中定义的那样。
3.3.3.2 请求令牌验证(Token Request Validation)
在使用混合流时,令牌请求的验证方式与在3.1.3.2节中定义的授权代码流相同。
3.3.3.3 成功的令牌响应
当使用混合流时,令牌响应的方式与授权代码流的方式相同,如3.1.3.3节中定义的那样。
3.3.3.4 令牌错误响应
当使用混合流时,令牌错误响应的方式与授权代码流相同,如3.1.3.4节中定义的那样。
3.3.3.5 令牌响应确认
在使用混合流时,令牌响应的验证方式与在3.1.3.5节中定义的授权代码流相同。
3.3.3.6 ID Token(ID Token)
在使用混合流时,从令牌终结点返回的ID Token的内容与从授权终结点返回的ID Token的内容相同,如3.3.2.11节中定义的那样,但本节中指定的差异除外。
如果一个ID Token从授权终结点和令牌终结点返回,对于response_type值code id_token和code id_token来说就是这样,那么iss和sub声明值在这两个ID Token中必须是相同的。任何一方中出现的关于身份验证事件的所有声明都应该出现在双方中。如果任何一个ID Token都包含关于最终用户的声明,那么在两者中出现的任何声明都应该具有相同的值。注意,出于隐私原因,OP可能选择从授权终结点返回关于最终用户的最少声明。从ID Token牌终结点返回,at_hash和c_hash声称可以省略,即使这些声明出现在从授权终结点中返回的 ID Token中,因为ID Token和Access Token值,在令牌终结点中返回时已经通过TLS加密并绑定在一起。
3.3.3.7 ID Token验证(ID Token Validation)
在使用混合流时,从令牌端点返回的ID令牌的内容必须以与在3.1.3.7节中定义的授权代码流相同的方式进行验证。
3.3.3.8 Access Token(Access Token)
如果一个从令牌的终结点的Access Token授权端返回,当 response_type 值是 “code id_token”和 “code id_token token” ,它们的值可能是相同的或者他们可能会有所不同。注意,可能会有不同的Access Token返回,这是由于两个端点的不同安全特性以及它们授予的资源的使用寿命和访问时间可能也不同。
3.3.3.9 Access Token验证(Access Token Validation)
当使用混合流时,从令牌端点返回的访问令牌将以与授权代码流相同的方式进行验证,如3.1.3.8节中定义的那样。
OpenID Connect Core 1.0(七)使用混合流验证的更多相关文章
- OpenID Connect Core 1.0(一)介绍
IdentityServer4是基于OpenID Connect and OAuth 2.0框架,OpenID Connect Core 1.0是IdentityServer4最重要的文档 By 道法 ...
- OpenID Connect Core 1.0(四)使用授权码流验证(上)
3.1 使用授权码流验证(Authentication using the Authorization Code Flow) 本节描述如何使用授权码流执行验证.当使用授权码流时,会从令牌终结点返回的所 ...
- OpenID Connect Core 1.0(九)声明(Claims)
5 声明(Claims) 这一节说明客户端如何获取关于终端用户声明和验证事件.它还定义了一组标准的基本声明配置.预定义一组可请求的声明,使用特定的scope值或能用于请求参数中的个人声明.声明可以直接 ...
- OpenID Connect Core 1.0(三)验证
OpenID Connect执行终端用户登录或确定终端用户已经登录的验证工作.OpenID Connect 使服务器以一种安全的方式返回验证结果.所以客户可以依靠它.出于这个原因,在这种情况下客户被称 ...
- OpenID Connect Core 1.0(八)从第三方发起登录
在某些情况下,登录流程由一个OpenID提供者或其他方发起,而不是依赖方(RP).在这种情况下,发起者重定向到RP在发起登录终结点,RP的请求验证请求发送到指定的OP.这个发起登录终结点可以在RP深度 ...
- OpenID Connect Core 1.0(六)使用隐式验证流
3.2 使用隐式验证流(Authentication using the Implicit Flow) 本节描述如何使用隐式流程执行验证.使用隐式流程时,所有令牌从授权终结点返回:不使用令牌终结点返回 ...
- OpenID Connect Core 1.0(五)使用授权码流验证(下)
3.1.2.6 验证错误响应(Authentication Error Response) 验证错误响应是一个OAuth 2.0授权错误响应消息,是RP发送授权请求的消息,由OP授权终结点的响应返回. ...
- OpenID Connect Core 1.0(二)ID Token
2.ID Token(ID Token) OpenID Connect主要是对OAuth 2.0 能够使得终端用户通过ID Token的数据结构进行验证.当客户端和潜在的其他请求声明,ID Token ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
随机推荐
- [SCOI2009]粉刷匠
线性DP预处理+分组背包 首先设dp[i][j][0/1]表示该木板前i个格刷了j次且最后一次颜色为0/1的最大正确数 做下0/1的前缀和然后转移状态 dp[i][j][k]=max(dp[l][j] ...
- Java基础之引用(String,char[],Integer)总结于牛客网的专项练习题
1.String的引用: 下列代码执行后的结果为: public class Test { public static void main(String[] args) { StringBuffer ...
- SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换
一.简述 mybatis驼峰式命名规则自动转换: 使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”: 使用好处:省去mapper.xml文件中繁琐编写表字段列表 ...
- Python库安装注意事项
由于一些python库依赖其它库或者其它组件,因此,在使用pip3命令安装python库的时候,经常会报错,告知缺失哪些组件. 但是, 开启VPN后,就没有再碰到类似错误,相关组件都是自动被安装. 因 ...
- 【tips】编译epic异常解决
目标:编译 epic 异常信息一: No CMAKE_C_COMPILER could be found. No CMAKE_CXX_COMPILER could be found. 解决方法: ...
- 一次spring aop 切面的问题
最新项目有个新需求,要在已经写好的controller里面 加上传入参数的验证,由于有多个 controller而且验证每个都要调用其他的服务,故决定采用spring的aop方式. 1.添加aop的验 ...
- Django objects.all() ,objects.get() ,objects.filter()之间的区别
ret=UserInfo.objects.all() all返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据. ret=UserIn ...
- Sqlserver函数基础使用
函数基本功能: 转换工厂日期,将8点20之前的时间转化为前一天的时间. if exists (select * from sysobjects where xtype='fn' and name='F ...
- exchange 2010 邮件服务器owa证书更新
exchange 2010应用环境 四台前端服务器,两台位于DMZ区,两台位于办公网环境,办公网和DMZ的服务器做了NLB负载均衡,操作系统为windows server 2008 r2. 目前前端h ...
- 沉淀再出发:再谈java的多线程机制
沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于ja ...