OpenID Connect:OAuth 2.0协议之上的简单身份层

  • OpenID Connect是什么?OpenID Connect(目前版本是1.0)是OAuth 2.0协议(可参考本人此篇:OAuth 2.0 / RCF6749 协议解读)之上的简单身份层,用 API 进行身份交互的框架,允许客户端根据授权服务器的认证结果最终确认用户的身份,以及获取基本的用户信息;它支持包括Web、移动、JavaScript在内的所有客户端类型;它是可扩展的协议,允许你使用某些可选功能,如身份数据加密、OpenID提供商发现、会话管理

  • OpenID Connect vs OpenID 2.0:OpenID Connect完成很多与OpenID 2.0相同的任务,是API-friendly,定义了可选的签名和加密的机制;OAuth 1.0a和OpenID 2.0的集成需要扩展,而OpenID Connect协议本身就建立在OAuth 2.0之上

  • 部分名词解释

    1. Relying Party(RP):依赖方,通常是第三方应用程序(客户端)
    2. OpenID Provider(OP):OpenID 提供方,通常是一个 OpenID 认证服务器,它能为依赖方提供断言以证实用户拥有某个标识
    3. End-User(EU):终端用户,指持有账号的人
  • OpenID Connect协议构成

    下边两条是 Web RPs 实现者的独立参考指南:

    协议迁移规范:

    OpenID Connect 工作组已启动新的工作计划:

    1. OpenID Connect Profile for SCIM Services – (Optional) Defines how to use SCIM with OpenID Connect

    2. OpenID Connect Federation – (Optional) Defines how sets of OPs and RPs can establish trust by utilizing a Federation Operator

    1. OpenID 2.0 to OpenID Connect Migration 1.0 – Defines how to migrate from OpenID 2.0 to OpenID Connect

    1. Basic Client Implementer’s Guide – Simple subset of the Core functionality for a web-based Relying Party using the OAuth code flow

    2. Implicit Client Implementer’s Guide – Simple subset of the Core functionality for a web-based Relying Party using the OAuth implicit flow

    1. Core – 定义 OpenID Connect 核心功能: 认证建立在OAuth 2.0之上,使用声明与终端用户进行信息交互

    2. Discovery – (Optional) Defines how Clients dynamically discover information about OpenID Providers

    3. Dynamic Registration – (Optional) Defines how clients dynamically register with OpenID Providers

    4. OAuth 2.0 Multiple Response Types – 定义了几种新的OAuth 2.0响应类型

    5. OAuth 2.0 Form Post Response Mode – (Optional) Defines how to return OAuth 2.0 Authorization Response parameters (including OpenID Connect Authentication Response parameters) using HTML form values that are auto-submitted by the User Agent using HTTP POST

    6. Session Management – (Optional) Defines how to manage OpenID Connect sessions, including postMessage-based logout functionality

    7. Front-Channel Logout – (Optional) Defines a front-channel logout mechanism that does not use an OP iframe on RP pages

    8. Back-Channel Logout – (Optional) Defines a logout mechanism that uses direct back-channel communication between the OP and RPs being logged out

  • OpenID Connect的工作流程:下以EU获取UserInfo为例来说明,

    1. RP(客户端)发送一个认证请求给OP;
    2. OP对EU进行身份认证并获得授权;
    3. OP发送ID Token给RP,通常也同时发送Access Token(为兼容OAuth 2.0。ID Token其实可以取代Access Token用来完成授权);
    4. RP使用Access Token发送一个请求UserInfo EndPoint;
    5. UserInfo EndPoint返回EU的Claims。

    下边是关于“ID Token 与 Access Token”的描述来自 User Authentication with OAuth 2.0 [UserInfo Endpoint]:

    It should be noted that clients are not required to use the access token, since the ID Token contains all the necessary information for processing the authentication event. However, in order to provide compatibility with OAuth and match the general tendency for authorizing identity and other API access in parallel, OpenID Connect always issues the ID token along side an OAuth access token.
  • ID Token:它是一种JWT(JSON Web Token)格式数据,主要由以下几部分构成:


    1. iss:必须。Issuer Identifier,OP的唯一标识,一个区分大小写的https URL,不包含query和fragment组件
    2. sub:必须。Subject Identifier,iss提供的EU的标识,在iss范围内唯一,最长为255个ASCII个字符,区分大小写
    3. aud:必须。Audience(s),标识ID Token的受众,必须包含OAuth2的client_id,分大小写的字符串数组
    4. exp:必须。Expiration time,超过此时间的ID Token会作废
    5. iat:必须。Issued At Time,JWT的构建的时间
    6. auth_time:AuthenticationTime,EU完成认证的时间。如果RP发送AuthN请求的时候携带max_age的参数,则此Claim是必须的
    7. nonce:RP发送认证请求的时候提供的随机字符串,用来减缓重放攻击,也可以用来关联客户端Session。如果nonce存在,客户端必须验证nonce
    8. acr:可选。Authentication Context Class Reference,表示一个认证上下文引用值,可以用来标识认证上下文类
    9. amr:可选。Authentication Methods References,表示一组认证方法
    10. azp:可选。Authorized party,结合aud使用。只有在被认证的一方和受众(aud)不一致时才使用此值,一般情况下很少使用


    形如:


    {"iss": "https://server.example.com","sub": "24400320","aud": "s6BhdRkqt3","nonce": "n-0S6_WzA2Mj","exp": 1311281970,"iat": 1311280970,"auth_time": 1311280969,"acr": "urn:mace:incommon:iap:silver"
    }


     关于协议定义Claims的更多信息参考:http://openid.net/specs/openid-connect-core-1_0.html#Claims。ID Token必须使用JWS进行签名,如果要用JWE加密也必须先进行JWS签名

  • JSON Web Signature (JWS):JSON数据进行数字签名或MACed后再经base64url编码。

    JWS Compact Serialization如下连接序列:Header.Payload.Signature

    BASE64URL(UTF8(JWS Protected Header)) || '.' ||
    BASE64URL(JWS Payload) || '.' ||
    BASE64URL(JWS Signature)


    1. JWS Protected Header{"typ":"JWT","alg":"HS256"}编码后:eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
    2. JWS Payload{"iss":"joe","exp":1300819380,"http://example.com/is_root":true}编码后:eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
    3. JWS SignatureSigning Input value:eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQHMAC SHA-256 key:{"kty":"oct","k":"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow"}JWS Signature:dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
    4. JWS Compact SerializationeyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.  eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk


    JWS JSON Serialization包含如下几个部分

    1. "protected", with the value BASE64URL(UTF8(JWS Protected Header))
    2. "header", with the value JWS Unprotected Header
    3. "payload", with the value BASE64URL(JWS Payload)
    4. "signature", with the value BASE64URL(JWS Signature)

    General JWS JSON Serialization:


    {"payload":"<payload contents>","signatures":[{"protected":"<integrity-protected header 1 contents>","header":<non-integrity-protected header 1 contents>,"signature":"<signature 1 contents>"},...{"protected":"<integrity-protected header N contents>","header":<non-integrity-protected header N contents>,"signature":"<signature N contents>"}]
    }


    Flattened JWS JSON Serialization:

    {"payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","protected":"eyJhbGciOiJFUzI1NiJ9","header": {"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
    }
  • JSON Web Encryption (JWE)

    JWE Compact Serialization如下连接序列

          BASE64URL(UTF8(JWE Protected Header)) || '.' ||BASE64URL(JWE Encrypted Key) || '.' ||BASE64URL(JWE Initialization Vector) || '.' ||BASE64URL(JWE Ciphertext) || '.' ||BASE64URL(JWE Authentication Tag)

    JWE JSON Serialization包含如下几个部分

  •       1. "protected", with the value BASE64URL(UTF8(JWE Protected Header))2. "unprotected", with the value JWE Shared Unprotected Header3. "header", with the value JWE Per-Recipient Unprotected Header4. "encrypted_key", with the value BASE64URL(JWE Encrypted Key)5. "iv", with the value BASE64URL(JWE Initialization Vector)6. "ciphertext", with the value BASE64URL(JWE Ciphertext)7. "tag", with the value BASE64URL(JWE Authentication Tag)8. "aad", with the value BASE64URL(JWE AAD)
  • General JWE JSON Serialization:

  • {"protected":"<integrity-protected shared header contents>","unprotected":<non-integrity-protected shared header contents>,"recipients":[{"header":<per-recipient unprotected header 1 contents>,"encrypted_key":"<encrypted key 1 contents>"},...{"header":<per-recipient unprotected header N contents>,"encrypted_key":"<encrypted key N contents>"}],"aad":"<additional authenticated data contents>","iv":"<initialization vector contents>","ciphertext":"<ciphertext contents>","tag":"<authentication tag contents>"
    }


    Flattened JWE JSON Serialization:


  • {"protected":"<integrity-protected header contents>","unprotected":<non-integrity-protected header contents>,"header":<more non-integrity-protected header contents>,"encrypted_key":"<encrypted key contents>","aad":"<additional authenticated data contents>","iv":"<initialization vector contents>","ciphertext":"<ciphertext contents>","tag":"<authentication tag contents>"
    }


  • Base64编码:Base64是基于64个可打印字母表(Table 1: The Base64 Alphabet)来表示数据的方法,可用于二进制数据如图片、视频、音频数据的转换表示,可查看RFC2045~RFC2049,上面有MIME(Multipurpose Internet Mail Extensions)的详细规范:

    1. 每3个字节一组,再按6bits(2 ^ 6 = 64)为一组分成4组,即3 * 8bits = 4 * 6bits;
    2. 以6bits的值为索引查找字母表中对应的字符。最后3字节变成4字节,长度增加33%;
    3. 对于不足3字节的情况用\x00字节补足,最后用尾部加“=”的个数来表示缺少的字节数,即Base64编码的尾部最多有1~2个“=”。

    在RFC 2045中还规定,输出每行不超过76字符(CRLF结尾):

    The encoded output stream must be represented in lines of no more than 76 characters each. All line breaks or other characters not found in Table 1 must be ignored by decoding software.

     由于+和/字符在URL中传递是不安全的,因此又出现了以-和_来替换+和/的Base64URL编码:

    由于“=”字符也可能出现在Base64编码中,但“=”用在URL、Cookie里面会造成歧义,所以很多Base64编码把“=”去掉。至于去掉“=”后如何解码呢?正常Base64编码后的序列字符数一定是4的倍数,如果结果不是,则可反推去掉了多少个“=”

     

  • 相关参考

    1. OIDC(OpenId Connect)身份认证授权(核心部分)

    2. RFC 7515 - JSON Web Signature (JWS)
    3. RFC 7516 - JSON Web Encryption (JWE)

     

相关文章: 

  • Thinktecture IdentityServer:.NET开源OpenID和OAuth解决方案

  • 教你实践ASP.NET Core Authorization(免看文档教程)

  • 双重OAuth 2.0架构

  • [认证授权] 1.OAuth2授权

  • [认证授权] 2.OAuth2授权(续) & JSON Web Token

  • 基于OAuth2的认证(译)

  • IdentityServer4(OAuth2.0服务)折腾笔记

  • [认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)

原文地址:http://www.cnblogs.com/XiongMaoMengNan/p/7381326.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

我们知道&#xff0c;不同肤色的人外貌差别很大&#xff0c;而双胞胎的辨识很难。有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎&#xff0c;在网络上经常一起出现。本文将带读者对这四个相似概念如何区分。 1.1. Web服务器概念与基本原理 1.1.1. Web服…

bladex实现单点登录

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是&#xff1a;2022年4月17日16:19:51 在实际开发中&#xff0c;有时候我们有这样的需求&#xff0c;即&#xff0c;一个体系中的用户是共通的&#xff0c;比如统一体系下&#…

若依实现单点登录(解析请求链接中的参数做鉴权认证)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是&#xff1a;2022年4月19日19:56:56 昨天写了个bladex的单点登录&#xff0c;回想起来还是比较复杂的&#xff0c;今天又收到了个在若依里面实现单点登录。具体是这样的:别的系…

Docker打包 Asp.Net Core应用,在CentOS上运行

本文主要介绍下运用docker虚拟技术打包Asp.net core应用。 Docker作为一个开源的应用容器引擎&#xff0c;近几年得到广泛的应用&#xff0c;使用Docker我们可以轻松实现应用的持续集成部署&#xff0c;一次打包&#xff0c;到处运行。 开篇借用百科上对docker的介绍。 Docker …

若依实现系统单点登录(可绕过验证码)

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言现在是&#xff1a;2022年4月19日19:56:56昨天写了个bladex的单点登录&#xff0c;回想起来还是比较复杂的&#xff0c;今天又收到了个在若依里面实现单点登录。具体是这样的:别的系…

springboot解析txt文件顺便加到数据库中(nohup文件)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是&#xff1a;2022年4月20日13:33:23 以前是怎么都没想到&#xff0c;我需要在服务器的nohup文件中找记录&#xff0c;然后往数据库里面更新。具体因为啥不提了&#xff0c;说多…

ASP.Net Core 2.0中的Razor Page不是WebForm

随着.net core2.0的发布&#xff0c;我们可以创建2.0的web应用了。2.0中新东西的出现&#xff0c;会让我们忘记老的东西&#xff0c;他就是Razor Page。下面的这篇博客将会介绍ASP.Net Core 2.0中的Razor Page。 在ASP.Net Core 2.0新特点之一就是支持Razor Page。今天的Razor…

记录几个部署项目常用的命令

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 查询运行项目的进程 ps -aux|grep farbeat 杀死进程 kill -9 1600336进入目录 cd /www/wwwroot/farbeat/查看文件 ls将日志输出在nohup文件中的方式启动项目(注意.jar文件的名字) nohup j…

C#最佳工具集合:IDE、分析、自动化工具等

C#是企业中广泛使用的编程语言&#xff0c;特别是那些依赖微软的程序语言。如果您使用C#构建应用程序&#xff0c;则最有可能使用Visual Studio&#xff0c;并且已经寻找了一些扩展来对您的开发进行管理。但是&#xff0c;这个工具列表可能会改变您编写C#代码的方式。 C#编程的…

常用公有云接入——AZURE

一、概念 1、订阅 可以使用订阅为组织内的团队提供访问开发环境&#xff08;即测试、生产、开发、临时部署等&#xff09;和项目的权限。针对每个应用程序环境创建不同的订阅&#xff0c;并为每个订阅分配不同的服务管理员帐户&#xff0c;这是保护每个环境安全的一个好方法。…

记录几个常用部署项目的命令,以备后用!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”查询运行项目的进程ps -aux|grep farbeat杀死进程kill -9 1600336进入目录cd /www/wwwroot/farbeat/查看文件ls将日志输出在nohup文件中的方式启动项目(注意.jar文件的名字)nohup java -…

分布式测试工具Beetle.DT的部署并进行HTTP,SQL,TCP压测

由于Beetle.DT是一个分布式压力测试工具&#xff0c;所以在使用上并不像普通工具那样安装运行这么简单&#xff1b;由于工具涉及到测试管理中心&#xff0c;节点和管理端等工具&#xff1b; 所以必须要进行相应的部署才能运行。接下来详解一下如果安装Beetle.DT并进行简单的HTT…

常用公有云接入——谷歌

一、概念 1、项目 一个账号有唯一的项目&#xff0c;所有虚拟机都在project里面建。 2、计算引擎 虚拟机资源。 二、创建方式 1、页面控制台 2、gcloud命令行 3、REST API 4、SDK 三、Java SDK 1、创建API服务凭据&#xff0c;并下载P12文件 2、Maven <dependency&…

elementui实现表格单选功能

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 需求是这样的&#xff1a;用户单击购买产品的按钮时&#xff0c;会出现一个产品的列表&#xff0c;但是呢只能买一种产品&#xff0c;暂时不可以多选。效果如下所示&#xff1a; 原来…

element-ui实现表格单选的功能

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言现在是&#xff1a;2022年4月20日13:33:23需求是这样的&#xff1a;用户单击购买产品的按钮时&#xff0c;会出现一个产品的列表&#xff0c;但是呢只能买一种产品&#xff0c;暂时不…

ASP.NET Core Razor 视图组件

视图组件简介 在新的ASP.NET Core MVC中&#xff0c;视图组件类似于局部视图&#xff0c;但它们更强大。视图组件不使用模型绑定&#xff0c;仅依赖于您在调用时提供的数据。 视图组件特性&#xff1a; 呈现页面响应的某一部分而不是整个响应包括在控制器和视图之间发现的关…

三个好用的并发工具类

转载自 三个好用的并发工具类 以前的文章中&#xff0c;我们介绍了太多的底层原理技术以及新概念&#xff0c;本篇我们轻松点&#xff0c;了解下 Java 并发包下、基于这些底层原理的三个框架工具类。 它们分别是&#xff1a; 信号量 Semaphore 倒计时门栓 CountDownLatch …

Error Handling in ASP.NET Core

前言 在程序中&#xff0c;经常需要处理比如 404&#xff0c;500 &#xff0c;502等错误&#xff0c;如果直接返回错误的调用堆栈的具体信息&#xff0c;显然大部分的用户看到是一脸懵逼的&#xff0c;你应该需要给用户返回那些看得懂的界面。比如&#xff0c;“当前页面不存在…

基于python的selenium

一.安装 安装WebDriver 查看chrome版本号&#xff0c;设置-帮助-关于Google chrome&#xff0c;找到版本号。 可以到这个网站进行下载对应版本的chromedriver,如果chrome浏览器版本过高,可以下载最新版的chromedriver进行使用 Chrome for Testing availability 下载下来之后…

多信息登录、检测用户信息是否完善且引导补全

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注&#xff1a;穆雄雄的博客 前言 现在是2022年4月28日13:41:29&#xff01; 今天分享两块内容。 1.需求&#xff1a;用户可以通过手机号、邮箱来注册我们的系统&#xff0c;用户完成之后&#xff0c;可以去完善自己的个人信息…