学习Identity Server 4的预备知识

我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去.这里需要使用identity server 4 做单点登陆.下面就简单学习一下相关的预备知识.

基于Token的安全验证体系

这个比较简单, 简单来说就是为了证明我们有访问权限, 我们首先需要获得一个token.

什么是token? 比如说: 可以访问某些大楼的门禁卡就是一种token, 回家开门的钥匙也是一种token.

为了获取到token, 首先你需要验证你的身份, 以证明你确实有权利获得token. 比如说, 你可以亮出身份证来证明自己, 或者使用密码.

比如说你想访问我的办公室, 你首先去安全部门亮出身份证, 然后安全办公室给你一个token, 然后使用这个token你就可以进入办公室去干事了.

使用基于token的安全体系有什么优点?

如果不使用token, 你可能需要到处使用密码来证明身份. 这样的话, 那每个地方都会知道你的密码了.

如果token丢失了, 我们可以吊销token.

并且token都有一定的时效性. 过期作废

总之, 使用这种方式, 你可以只在一个地方使用密码, 别的地方不会知道你的密码.

交换凭证获取token并使用token

有一个已注册用户, 她为了获取token, 就需要与authorization server进行通信. 这个authorization server负责发放token, 并且确保token是否仍然有效. 它同时也负责跟踪用户的用户名和密码. 而这个authorization server可以存在于世界的任何地方, 它并不是非得和我们的web api或者网站放在一起. 它完全是一个独立的系统, 跟踪着用户的用户名密码以及用户的访问权限.

这里这个用户就向authorization server提供了用户名和密码, 然后她就获得了token. 然后她就可以使用这个token做一些事情了, 比如使用token访问api请求所有的订单信息, 这时api就会知道这个token是有效的.

甚至, 用户使用token可以访问第三方服务, 第三方服务再使用这个token来访问我们的api.

向第三方服务提供token肯定比提供用户名密码安全多了.

要把Token向密码一样对待

保护好token, 因为别人获得token后将会和你拥有一样的权限.

token是有时效性的, 具体有效期是多久是由authorization server决定的.

token是可以吊销的, 你可以告诉authorization server注销你的token, 但是要注意的是, 是由api决定是否向authorization server查询token的有效性, 如果你吊销token或api没有向authorization server进行查询, 那么你的token对api来说依然有效.

如何保证token的安全

如图, 用户带着token向api发出请求, token是附带在header中, api收到请求后会返回一些数据.

如果有人查看了这个token, 并要篡改token里面的数据, 那可就不好了

那么如何保证token不被篡改呢? 这个工作是由api来做的, 它要确保没人篡改过token.

在基于token验证的情景中, 所有从authorization server获取的token都是使用一个private key签过名的. token包括一些信息: 用户本身(email, 权限等等), 也可能包括是谁发布了token.

任何一个服务想确定没人篡改过token, 就需要使用public key.

private key 可以用于锁定 token.

针对token和它带的数据以及在token尾部的签名信息, 只要没人篡改数据, 那么token的签名就是一定的.

authorization server提供的public key是任何人都可以访问的, public key是用来确保没人篡改过数据.

Token

如果在api里面验证了token的完整性, 那么我们就会知道token是ok的.

我们这里研究的token是Json Web Token.

token是由authorization server签名发布的.

authorization server就是使用oauth和openid connect等协议, 并且用户可以使用用户名密码等方式来换取token的服务, 这些token让我们拥有了访问一些资源的权限.

private key 是用来签发token用的, 它只存在于authorization server, 永远不要让别人知道private key.

public key 是用来验证token的, authorization server 会让所有人都知道这个public key的.

api或者各种消费者应该一直检验token, 以确保它们没有被篡改. 它们可以向authorization server申请public key, 并使用它来验证token. 也可以把token传递给authorization server, 并让authorization server来进行验证.

Token同时也包含着authorization server的一些信息. 比如是由哪个authorization server发布的token.

Token的信息是使用Base64编码的.

OAuth 和 OpenId Connect

他们都是安全协议.

现在使用的都是OAuth 2.0, 注意它与1.0不兼容.

OAuth 2.0是用于authorization的工业标准协议. 它关注的是为web应用, 桌面应用, 移动应用等提供特定的authorization流程并保证开发的简单性.

Authorization的意思是授权, 它表示我们可以授权给某些用户, 以便他们能访问一些数据, 也就是提供访问权.

OAuth是基于token的协议.

有些人可能对Authorization和Authentication分不清, 上面讲了authorization, 而authentication则是证明我是谁, 例如使用用户名和密码进行登录就是authentication.

OAuth只负责Authorization. 那么谁来负责Authentication呢?

那就是OpenId Connect, OpenId Connect是对OAuth的一种补充, 因为它能进行Authentication.

OpenId Connect 是位于OAuth 2.0上的一个简单的验证层, 它允许客户端使用authorization server的authentication操作来验证终端用户的身份, 同时也可以或缺终端客户的一些基本信息.

可以有多种方式来实现OAuth和OpenId Connect这套协议.

你可以自己去实现. 

我要使用的是Identity Server 4.

其实也可以使用一些Saas/Paas服务, 例如Amazon Cognito, Auth0(这个用过, 有免费版), Stormpath.

OAuth 2.0 RFC 6794

想研究的比较透彻的话, 还是要多读几遍 RC 6749文档: https://tools.ietf.org/html/rfc6749

OAuth通常有以下几种endpoint:

1. /authorize, 请求token(通过特定的流程flows)

2. /token, 请求token(通过特定的流程flows), 刷新token, 使用authorization code来换取token.

3. /revocation, 吊销token.

OpenId Connect 通常有以下几种 endpoints:

1. /userinfo, 获取用户信息

2. /checksession, 检查当前用户的session

3. /endsession, 终结当前用户的session

4. /.well-known/openid-configuration, 提供了authorization server的信息(endpoints列表和配置信息等)

5. /.well-known/jwks, 列出了JWT签名key的信息, 它们是用来验证token的.

获取Token的例子:

使用postman大约是这样发送请求.

请求返回的结果大约是这样的:

access_token就是token, expires_in是有效时间, 类型是 Bearer.

可以到jwt.io去解析token: http://jwt.io/

由于网络问题, 我今天无法使用这个网站.....以后做项目写文章的时候再介绍. 这里你可以试试把一个token的数据更改之后, token验证就出错了. 

下面这个图是如何使用token访问api:

Access Token (JWT)

红色的是Header, 橘色的是Payload, 蓝色的是签名Signature. 它们是用.分开的

Signature主要是来保证Payload的完整性. Header包含了token的结构信息.

Payload有时候也叫做Claims, 它通常包括发布者issuer(authorization server), Audience, 有效期, 有时也包括token应该是从什么时候开始有效, Client ID(这是那些注册于authorization server的应用), Scopes(限定访问的范围), 自定义数据.

Scopes

scopes可以限定访问的范围.

OpenId Connect为我们指定了一些 Scopes, 包括: openid, profile, email, address, offline_access等等.

当然也可以自定义scope.

选择一个流程 Flow

Redirect Flows, 它可以这样解释: 有一个用户想要访问我的网站, 我想让他登录, 但又不想让他把用户名和密码提供给我, 因为我没有用户的信息. 用户的信息都在authorization server上了. 所以我把用户重定向到authorization server, 提供他们的用户名和密码, 然后重定向返回到我的网站, 获取了token, 这时我就知道他们已经登录好了.

 

Redirect Flows又分两种: 1 Implicit Grant(就是上面说的那个), 2 Authorization Code(它并没有返回token, 而是返回了authorization code, 而网站可以使用authorization code来换取token).

所以implicit grant适合于javascript客户端, 而其他应用更适合使用authorization code, 这些应用可以使用authorization code刷新token.

Credential Flows: 1.Resource Owner Password Credentials(用户名密码). 2. Client Credentials(例如适用于没有用户参与的情况).

相关文章:

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

  • IdentityServer4 实现 OpenID Connect 和 OAuth 2.0

  • IdentityServer4 使用OpenID Connect添加用户身份验证

  • IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

  • IdentityServer4 指定角色授权(Authorize(Roles="admin"))

  • IdentityServer4 SigningCredential(RSA 证书加密)

  • IdentityServer4 实现自定义 GrantType 授权模式

  • IdentityServer4 配置负载均衡

原文地址:http://www.cnblogs.com/cgzl/p/7746496.html


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

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

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

相关文章

【FTP】发布FTP服务器

FTP是用来传输文件的一种协议,类似于http 这次主要是用以下两个软件来完成局域网文件的传输 FileZillaServer.zip:开启FTP服务 FlashFXP54Setup.exe:更加便捷的传输上传文件 链接 链接:https://pan.baidu.com/s/1zTMXUO4EPD9l7_LH…

C/C++输入输出流

istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到达到换行符。不同的是,getline()将丢弃换行符,而get()将换行符保留在输入序列中。 目录 一、字符串…

帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)

转载自 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)   作为一名前端工程师,必须搞懂JS中的prototype、__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆&#xff…

ssl1715-计算面积【差积】

正题 题目大意 给一个平行四边形的3个点&#xff0c;求最大面积。 解题思路 明显答案就是差积*2的绝对值。 codecodecode #include<cstdio> #include<algorithm> #include<cmath> #define db double using namespace std; int n; struct node{db x,y; }p[…

ASP.NET Core 企业级开发架构简介及框架汇总

一、 垂直方向架构 1. 多层架构 分层架构通过程序包或者程序的隔离构建松耦合的应用。我们以最近流行的洋葱架构模型进行分析&#xff0c;如图

【Php】最最简单的php环境搭建

Wamp是apachemysqlphp的集成环境&#xff0c;通过一键安装程序&#xff0c;可以完全免除配置的烦恼。 链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1717Mw66Z1wZ67ltLriUVew 提取码&#xff1a;7h5t 下载之后一直下一步&#xff0c;默认默认即可 如果输入local…

01)自学JavaScript

1. JavaScript 简介 1.1 JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言。 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏览器执行。 2. JavaScript 用法 HTML 中的脚本必须位于 <script> 与 &l…

ssl1213-多边形面积【差积,计算几何】

正题 题目大意 求一个多边形面积。 解题思路 随便定一个原点&#xff0c;然后答案就是相邻点的差积之和的绝对值。 要判断不能组成多边形的情况。 codecodecode #include<cstdio> #include<algorithm> #include<cmath> #define N 1010 #define db double …

Memcached总结

一、介绍 Memcached是一个自由开源的&#xff0c;高性能&#xff0c;分布式内存对象缓存系统。 Memcached是一种基于内存的key-value存储&#xff0c;用来存储小块的任意数据&#xff08;字符串、对象&#xff09;。 目的&#xff1a;通过缓存数据库查询结果&#xff0c;减少…

浅析C#中单点登录的原理和使用

是单点登录&#xff1f; 我想肯定有一部分人“望文生义”的认为单点登录就是一个用户只能在一处登录&#xff0c;其实这是错误的理解&#xff08;我记得我第一次也是这么理解的&#xff09;。 单点登录指的是多个子系统只需要登录一个&#xff0c;其他系统不需要登录了&#xf…

虚拟机和linux的安装

下载地址&#xff1a; 虚拟机14版本的&#xff1a; 链接:https://pan.baidu.com/s/1lxp62gerSI_29wQDuTEAJQ 提取码:53dn 乌班图 https://ubuntu.com/download

Mybatis入门程序增删改查操作

学习目标 了解Mybatis的基本知识熟悉Mybatis的工作原理掌握Mybatis入门程序的编写 文章目录 1.初始Mybatis 2.Mybatis入门程序 3.Mybatis操作总结 1.初始Mybatis MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所…

Memcached:列出所有Key

翻译自 Memcached&#xff1a;列出所有Key 在一般情况下&#xff0c;有没有办法列出所有的Key&#xff0c;一个memcached的实例存储。但是&#xff0c;您可以列出类似于第一个1Meg键的内容&#xff0c;这在开发过程中通常就足够了。这是如何做&#xff1a; Telnet到您的服务…

jzoj5354-导弹拦截【dp,最大匹配,最少路径覆盖】

正题 解题思路 一个东西可以拦截导弹&#xff0c;每次只能打比上一次x,y,zx,y,zx,y,z都大的导弹。求一个最多可以拦截掉多少个导弹和至少要多少个才能拦截完。拦截导弹没有顺序要求。 解题思路 由于没有顺序要求所以我们可以直接定义一个比较&#xff0c;然后第一问做法和导弹…

ASP.NET Core 2.0 全局配置项

问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项&#xff1f; 答案 首先新建一个空项目&#xff0c;并添加两个配置文件&#xff1a; 1. appsettings.json { "Section1": { "SettingA": "ValueA", "SettingB": "V…

Auto.JS 教程

最近淘宝双十一活动来了&#xff0c;有个自动领猫币的脚本&#xff0c;基于auto.js&#xff0c;亲测有效。有兴趣的点这里 声明&#xff1a; 本教程基于b站up主-笔青居的视频。传送门&#xff1a;https://space.bilibili.com/21486893/video Auto.JS Auto.js 是个基于 JavaScri…

Mybatis的核心配置

学习目标 了解Mybatis核心对象的作用熟悉Mybatis配置文件中各个元素的作用掌握Mybatis映射文件中常用元素的使用 文章目录 1.Mybatis的核心对象 1.1 SqlSessionFactory 1.2 SqlSession 1.2.1 使用工具类创建SqlSession 2. 配置文件 2.1 主要元素 3. 映射文件 2.1主要元素…

jzoj5353-村通网【最小生成树】

正题 题目大意 一条边的价格为两个点的曼哈顿距离乘B&#xff0c;修建源点价格为A。要求每个联通块内都有源点的最小价格。 解题思路 对于最终每个联通块肯定是棵树。对于合并每个联通块可以减少一个源点。所以将最小生成树上价格小于A的边都加进去就可以了。 codecodecode …

auto.js小案例

微信朋友圈自动点赞 var it className("ListView").findOne(); var i1;while(i<5){say desc(评论).findOne();say.click();goodtext(赞).findOne();goodpgood.parent();goodp.click();sleep(1000);it.scrollDown();i; }home();微信轰炸机 toast("轰炸机已准…

本土开源、立足全球 | COSCon'17

全球公有云 90% 的服务器运行的是开源 Linux 操作系统&#xff01; GitHub 上有超过 150 万个组织&#xff0c;正在进行开源开发&#xff01; 本土开源项目目前在 Apache 的顶级以及孵化列表中已经有 6 个&#xff01; 你想知道这其中都有什么奥秘吗&#xff1f;Apache 顶级项目…