IdentityServer4系列 | 常见术语说明

一、前言

在上一篇中,我们IdentityServer4的说明,认识到是一个基于OpenID Connect协议标准的身份认证和授权程序,并简单的对基础知识的认识以及区别说明,从OAuth、OpenID、OpenID Connect以及JWT等进行对比区别说明。

而在这一篇中,我们主要对IdentityServer4中涉及使用的特定的相关术语进行说明。

二、术语

2.1 身份认证服务器(IdentityServer)

IdentityServer 是基于OpenID Connect协议标准的身份认证和授权程序,它实现了OpenID Connect 和 OAuth 2.0 协议。

同样的角色,不同的文档使用不同的术语。在有些文档中,它(IdentityServer)可能会被叫做安全令牌服务器(security token service)、身份提供者(identity provider)、授权服务器(authorization server)、 标识提供方((IP-STS,什么是IP-STS)等等。

但是它们都是一样的,都是向客户端发送安全令牌(security token),

IdentityServer有许多功能:

  • 保护你的资源

  • 使用本地帐户或通过外部身份提供程序对用户进行身份验证

  • 提供会话管理和单点登录

  • 管理和验证客户机

  • 向客户发出标识和访问令牌

  • 验证令牌

2.2 用户(User)

用户是使用已注册的客户端访问资源的人。

指在id4中已经注册的用户

2.3 客户端(Client)

客户端就是从identityserver请求令牌的软件,既可以通过身份认证令牌来验证识别用户身份,又可以通过授权令牌来访问服务端的资源。但是客户端首先必须在申请令牌前已经在identityserver服务中注册过。

实际客户端不仅可以是Web应用程序,app或桌面应用程序,SPA,服务器进程等。

客户端:web、app、桌面应用、SPA、服务器进程

2.4 资源(Resources)

资源就是你想用identityserver保护的东西,可以是用户的身份数据或者api资源。每一个资源都有一个唯一的名称,客户端使用这个唯一的名称来确定想访问哪一个资源

在访问之前,实际identityserver服务端已经配置好了哪个客户端可以访问哪个资源,所以你不必理解为客户端只要指定名称他们就可以随便访问任何一个资源

用户的身份信息实际由一组claim组成,例如姓名或者邮件都会包含在身份信息中。

用户身份信息将来通过identityserver校验后都会返回给被调用的客户端

API资源就是客户端想要调用的功能——通常通过 Web API 来对 API 资源建模,但这不是必须的,如下说明:

通常以json或xml的格式返回给客户端,例如webapi,wcf,webservice,可以使其他类型的格式,这个要看具体的使用场景了。

2.5 身份令牌(Id Token)

OIDC对OAuth2最主要的扩展就是提供了ID Token。来解决第三方客户端标识用户身份认证的问题。

OIDC的核心在于在OAuth2的授权流程中,一并提供用户的身份认证信息(ID Token)给到第三方客户端,ID Token使用JWT格式来包装,得益于JWT(JSON Web Token)的自包含性,紧凑性以及防篡改机制,使得ID Token可以安全的传递给第三方客户端程序并且容易被验证。此外还提供了UserInfo的接口,用户获取用户的更完整的信息。

ID Token是一个安全令牌,表示的是认证过程的输出,是一个授权服务器提供的包含用户信息,还包含了用户的认证时间和认证方式。身份令牌可以包含额外的身份数据。

由一组Cliams构成以及其他辅助的Cliams的JWT格式的数据结构组成。

ID Token的主要构成部分如下(使用OAuth2流程的OIDC)。

  1. iss = Issuer Identifier:必须。提供认证信息者的唯一标识。一般是一个https的url(不包含querystring和fragment部分)。

  2. sub = Subject Identifier:必须。iss提供的EU的标识,在iss范围内唯一。它会被RP用来标识唯一的用户。最长为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发送请求的时候提供的随机字符串,用来减缓重放攻击,也可以来关联ID Token和RP本身的Session信息。

  8. acr = Authentication Context Class Reference:可选。表示一个认证上下文引用值,可以用来标识认证上下文类。

  9. amr = Authentication Methods References:可选。表示一组认证方法。

  10. azp = Authorized party:可选。结合aud使用。只有在被认证的一方和受众(aud)不一致时才使用此值,一般情况下很少使用。

ID Token通常情况下还会包含其他的Claims。

(毕竟上述claim中只有sub是和EU相关的,这在一般情况下是不够的,必须还需要EU的用户名,头像等其他的资料,OIDC提供了一组公共的cliams,请移步这里http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)。另外ID Token必须使用JWS进行签名和JWE加密,从而提供认证的完整性、不可否认性以及可选的保密性。

简而言之ID Token就是JWT格式的数据,包含一个人类用户的身份认证的信息,一个ID Token的例子如下:

2.6 访问令牌(Access Token)

访问令牌允许客户端访问某个 API 资源。客户端请求到访问令牌,然后使用这个令牌来访问 API资源。访问令牌包含了客户端和用户(如果有的话,这取决于业务是否需要,但通常不必要)的相关信息,API通过这些令牌信息来授予客户端的数据访问权限。

OAuth2提供了Access Token来解决授权第三方客户端访问受保护资源的问题;

2.7 刷新令牌(Refresh Token)

Access Token 是客户端访问资源服务器的令牌。拥有这个令牌代表着得到用户的授权。然而,这个授权应该是临时的,有一定有效期。这是因为,Access Token  在使用的过程中可能会泄露。给 Access Token  限定一个较短的有效期可以降低因 Access Token  泄露而带来的风险。

然而引入了有效期之后,客户端使用起来就不那么方便了。每当 Access Token  过期,客户端就必须重新向用户索要授权。这样用户可能每隔几天,甚至每天都需要进行授权操作。这是一件非常影响用户体验的事情。希望有一种方法,可以避免这种情况。

于是 Oauth2.0 引入了 Refresh Token 机制。Refresh Token 的作用是用来刷新 Access Token。鉴权服务器提供一个刷新接口,例如:

http://xxx.xxx.com/refresh?refreshtoken=&client_id=

传入 refresh token 和 client_id,鉴权服务器验证通过后,返回一个新的 access token。为了安全,Oauth2.0 引入了两个措施:

1,Oauth2.0 要求,refresh token 一定是保存在客户端的服务器上的,而绝不能存放在狭义的客户端(例如移动 app、PC端软件) 上。调用 refresh 接口的时候,一定是从服务器到服务器的访问;

2,Oauth2.0 引入了 client_secret 机制。即每一个 client_id 都对应一个 client_secret。这个 client_secret 会在客户端申请 client_id 时,随 client_id 一起分配给客户端。客户端必须把 client_secret 妥善保管在服务器上,决不能泄露。刷新 access token 时,需要验证这个 client_secret。

于是,实际上的刷新接口应该是类似这样的:

http://xxx.xxx.com/refresh?refreshtoken=&client_id=&client_secret=

以上就是 Refresh Token 机制。Refresh Token  的有效期非常长,会在用户授权时,随 Access Token 一起重定向到回调 url,传递给客户端。

三、总结

  1. 本篇主要是对IdentityServer4的说明,以及其中涉及常见的术语的表述说明。

  2. 从身份认证服务器、用户、客户端、资源以及各个令牌等进行对比区别说明。

  3. 在后续中会对多种授权模式,数据库持久化以及UI界面优化和常见问题,搭建一个完整可用的认证授权项目。

  4. 如果有不对的或不理解的地方,希望大家可以多多指正,提出问题,一起讨论,不断学习,共同进步。

四、参考

Terminology——常见术语

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

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

相关文章

网易年薪40W架构师面试题,欢迎自测!

一个月前被拉进了一个微信群,名字叫《明日都是大佬》,群里有20多个人,都是正在跳槽的,目标是年薪30w!投简历、笔试、面试后都相互分享,互通有无你懂的。拉我进群是帮忙解答一些难题,很多题目还是…

leetcode257. 二叉树的所有路径(java递归详解)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

leetcode617. 合并二叉树

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)

前言权限管控对于一个系统来说是非常重要的,最熟悉不过的是菜单权限和数据权限,上一节通过Jwt实现了认证,接下来用它实现接口权限的验证,为什么不是菜单权限呢?对于前后端分离而言,称其为接口权限感觉比较符…

.NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

目录什么是软件架构软件架构的基本思路单体向分布式演进、云原生、技术中台1.1 什么是软件架构1.1.1 什么是架构?Software architecture {Elements, Forms, Rationale/Constraints}元素、形式/模式、基本原理和限制为什么需要软件架构?软件架构的终极目…

leetcode530. 二叉搜索树的最小绝对差

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

再分享 5 个 vs 调试技巧

前言 之前在《5 个非常实用的 vs 调试技巧》和《继续分享 5 个实用的 vs 调试技巧》中分享了 10 个我认为非常值得了解的 vs 调试技巧,本周继续分享 5 个很实用的调试技巧。1. 显示下一条语句 在调试时,遇到断点中断后,为了更加清楚的了解程…

leetcode501. 二叉搜索树中的众数

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

网络知识 | 《图解HTTP》读书笔记(上)

【网络知识】| 作者 / Edison Zhou这是EdisonTalk的第293篇原创内容作为一个专业的IT技术人,一个Web应用开发者,不了解网络基础和协议,怎么能行?本文是我2016年阅读《图解HTTP》一书的读书笔记,希望对你有所帮助&#…

leetcode292周赛--6057. 统计值等于子树平均值的节点数

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

C# 中 System.Range 结构体

翻译自 John Demetriou 2020年4月6日 的文章 《C# 8 Is Introducing Ranges》我们之前讨论过的 C# 中的一个特性 System.Index 结构体,与另一特性 System.Range 结构体 是携手并进的。在 C# 8.0 之前,没有访问集合中任意部分的范围或切片的语法。开发人员…

leetcode292周赛--6056. 字符串中最大的 3 位相同数字

一:题目 二:上码 class Solution { public:string largestGoodInteger(string num) {int slowIndex 0;int count 0;vector<int> ans;for (int fastIndex 1; fastIndex < num.size(); fastIndex) {if (num[fastIndex] ! num[slowIndex]) {slowIndex;} else {//相等…

GDB 调试 .NET 程序实录 - .NET 调用 .so 出现问题怎么解决

注&#xff1a;本文重要信息使用 *** 屏蔽关键字。最近国庆前&#xff0c;项目碰到一个很麻烦的问题&#xff0c;这个问题让我们加班到凌晨三点。大概背景&#xff1a;客户给了一些 C语言 写的 SDK 库&#xff0c;这些库打包成 .so 文件&#xff0c;然后我们使用 C# 调用这些库…

leetcode236. 二叉树的最近公共祖先(java递归)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {/**思路:1.后序遍历 从下往上遍历 找到目标结点后然后做逻辑判断处理1…

WPF MVVM 弹框之等待框

WPF MVVM 弹框之等待框目录一、效果二、弹框主体改造三、等待动画用户控件四、弹窗 ViewModel 和帮助类的改造五、使用方法和代码地址独立观察员 2020年10月13日之前写过一篇《WPF MVVM 模式下的弹窗》&#xff0c;里面实现了确认框和消息框&#xff0c;经过一段时间的演化&…

设计一个具有等待队列的连接池

说到连接池相关很多人都使用过&#xff0c;常见的有数据连接池&#xff0c;HttpClient连接池等。连接池的作用是保持一定量的连接让交互过程复用这些连接&#xff0c;从而大大节省连接创建过程或过多的损耗。在连接池策略中往往当池没有连接的情况都会抛出异常告诉使用者资源无…

leetcode701. 二叉搜索树中的插入操作

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

你不该错过的2020中国开源年报,填开源开发者问卷,成为国内开源的见证者

点击上方“开源社”关注我们| 作者&#xff1a;王伟| 编辑&#xff1a;黄欣宜| 设计&#xff1a;冯艺怡| 责编&#xff1a;王玥敏卷首语一年一度的中国开源年报再度启动&#xff5e;中国开源年报由开源社发起。旨在从多种维度&#xff0c;多种方式&#xff0c;多种协作来呈现国…

leetcode450. 删除二叉搜索树中的节点(java详解版)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

.NET Core使用FluentEmail发送邮件

前言在实际的项目开发中&#xff0c;我们会遇到许多需要通过程序发送邮件的场景&#xff0c;比如异常报警、消息、进度通知等等。一般情况下我们使用原生的SmtpClient类库居多&#xff0c;它能满足我们绝大多数场景。但是使用起来不够简洁&#xff0c;许多场景需要我们自行封装…