前言

互联网时代,对信息和资源的保护越发苛刻,在所有应用中授权和认证是必不可少缺少的一部分。如果一个应用没有授权和认证那么这个应用就是不完整或者说不安全的应用。在.Net平台给我们提供了一套完整的授权认证框架,那就是IdentityServer4。它实现了OpenId Connect和OAuth2.0协议的认证授权。

授权认证

很多人喜欢把授权和认证混为一谈,但是其实授权(Authorization)和认证(Authentication)是有区别的。

Authorization(授权) - 侧重点是用户能干嘛,而不关心用户是谁。

Authentication(认证) - 侧重点是用户是谁,而不是用户能干嘛。

OpenId

OpenID 是一个以用户为中心的数字身份识别框架,是一个以URL为身份标识的分散式身份验证解决方案,它具有开放、分散、自由等特性。

OpenID相关基本术语:

用户 - 想要向某个网站表明身份的人。

标识 - 用户用以标识其身份的URL。

身份提供者 - 提供OpenID URL注册和验证服务的服务提供者。

依赖方 - 想要对最终用户的openId进行验证的网站应用。

举个例子, 我使用QQ(身份提供者)登陆京东(依赖方),我打开京东主页点击QQ登陆并不会要我输入我的QQ账号和密码,会先跳转到QQ授权登陆页面,当你扫码或者密码登陆的时候QQ会返回给京东一个OpenId,京东就会拿着这个OpenId来问QQ你这里是不是有这么一个用户。

OpenId关注的是Authentication(认证)。

OAuth2

OAuth是当下比较流行的授权第三方应用读取用户的资源的机制。OAuth能在不涉及到用户的账号信息的情况下,读取用户的一些资源信息。

举个例子,每周都会有保洁阿姨来家里打扫,但是保洁阿姨并不知道我家大门的密码,所以每次保洁阿姨在要上门的时候会在app上申请获取一个临时密码,当我收到保洁阿姨的申请后,确认给予临时密码后保洁阿姨就能通过这个密码进入房子啦。

我就是用户,家,和房间就是我的资源,临时密码是token。阿姨是第三方应用。阿姨申请临时密码需要进入我的家(第三方应用申请读取我的数据),我(用户)收到申请后给予临时密码(用户确认授权读取数据)。阿姨收到临时密码进入房间(获取到相应的token读取数据)。

但是临时密码(token)还是有很多局限性的,比如时效性(规定时间内使用才有效),局限性(只能开一次门,不能进去我私人房间),我还可以在中途撤销授权,使临时密码(token)无法进去我的房间(无法读取我的数据)。



授权过程

(A)用户打开客户端以后,客户端要求用户给予授权。(阿姨打开某公寓App申请临时密码)

(B)用户同意给予客户端授权。 (我同意给予临时密码)

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。 (同意后,向某某公寓后台申请临时密码)

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。(某某公寓后台确认我同意给予临时密码后,给阿姨发放临时密码)

(E)客户端使用令牌,向资源服务器申请获取资源。(阿姨使用临时密码来开门)

(F)资源服务器确认令牌无误,同意向客户端开放资源。(密码锁收到临时密码验证后开门)

OAuth关注的是Authorization(授权)。

OpenId Connect

OpenID Connect简称OIDC。因为OAuth2是一个授权协议,它无法提供完善的身份认证功能。所以它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。OIDC使用OAuth2的授权来为第三方客户端提供用户的身份认证,并把对应的身份认证信息传递给客户端,且可以适用于各种类型的客户端,并且完全兼容OAuth2,也就是说你搭建了一个OIDC的服务后,也可以当作一个OAuth2的服务来用。

术语介绍

User - 用户。

Client - 客户端。

IdentityServer - 授权认证服务器。

Resources - 需要保护的资源。

Access Token - 访问令牌,允许用户哪些资源。

Identity Token - 身份令牌,用户确认用户身份。

JWT

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JWT是由三段字符串拼接而成的,使用 . 分割的。

eyJhbGciOiJSUzI1NiIsImtpZCI6IjIxNmd3ZUVTZTA3d29hSDhpWHAzMUEiLCJ0eXAiOiJhdCtqd3QifQ.eyJuYmYiOjE1NzY2NTYwOTMsImV4cCI6MTU3NjY1OTY5MywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAzIiwiYXVkIjoiQXBpX0EiLCJjbGllbnRfaWQiOiJjbGllbnRfYSIsInNjb3BlIjpbIkFwaV9BIl19.kdszQIZFTS8aURbF5lIL1-qFzkJ79plH0seM4TsrTPdZoWakJVTH76-qmRpu6H6eaQt7U10R-Y8fn5N2FFh6XHRuDufEsDL8R2Tv7Cu0qbHKHTi-LgZcU2CxM22RyL6Df7Z0IpG5uEQqJ2LyxHJg3W-D3TgSNXUA8ge87ghGrhLRQ8hywH5gM4EZy9lKO7vMZml1IIfuyXTC8FU-HUn6-ZmvC1mADlAQJv84WHyg7fzzgNXqztvSyXA2p6jJG5FDgAjA9-yWnqJPxlZe7-Qi5Dj67lEF9kSII0tblV8JpxxJTpUvM2iPMLKWw77HDGaZkfAUu9WsbpQv-zWXPBBpbw

我们通过jwt.io解析出来。

第一部分Hrader

alg - 签名算法

kid - 密钥的Id

typ - token类型

这三个参数是最常见的。d

第二部分PayLoad

nbf - 生效时间

exp - 过期时间

iss - 令牌发放者

chlien_Id - 发放客户端id

aud - 令牌接收方

scope - 可访问资源

在PayLoad中可以放置任何你想要的参数。

第三部分Signature

Signature 是对前两部分的签名,防止数据篡改。

JWT的认证过程

1.用户使用账号密码或别的方式登陆

2.服务器接受到登陆请求后生成一个jwt token

3.服务器把jwt token返回给客户端

4.客户端在请求资源在Header中的authorization带上jwt token

5.服务器对jwt进行验签,验签成功后根据PayLoad中的信息判断认证是否通过

6.响应客户端结果

授权方式-后面有实现的传送门

Client Credentials - 客户端授权模式。 - 实现传送门

Resource Owner Password Credentials - 密码模式。 - 实现传送门

Implicit - 授权码简化模式。

Authorization Code - 授权码模式。

总结

都是自己一边学习IdentityServer4一边写,每种模式后都有实现传的送门,文中如果有神马错误请大佬们在评论区指出。

IdentityServer4学习笔记汇总(实现传送门在底部)的更多相关文章

  1. NGUI学习笔记汇总

    NGUI学习笔记汇总,适用于NGUI2.x,NGUI3.x 一.NGUI的直接用法 1. Attach a Collider:表示为NGUI的某些物体添加碰撞器,如果界面是用NGUI做的,只能这样添加 ...

  2. 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2  任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...

  3. 前端学习笔记汇总(之merge方法)

    学习笔记 关于Jquery的merge方法 话不多说,先上图 使用jquery时,其智能提示如上,大概意思就是合并first和second两个数组,得到的结果是first+(second去重后的结果) ...

  4. DeepLearning.ai学习笔记汇总

    第一章 神经网络与深度学习(Neural Network & Deeplearning) DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络 DeepLe ...

  5. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  6. Mybatis学习笔记汇总(包括源码和jar包)

    博客整理 Mybatis学习笔记(一)--对原生jdbc中问题的总结 Mybatis学习笔记(二)--Mybatis框架 Mybatis学习笔记(三)--入门程序 MyBatis学习笔记(四)--入门 ...

  7. IdentityServer4 学习笔记[1]-客户端授权

    前言 本文内容来自IdentityServer4官网,官网有详细的介绍,并且有源码Demo 官网源码例子传送门 建立授权服务端 我们暂时不配置Https,选择空模板建立项目,项目建立后, 为了查看de ...

  8. HTML学习笔记汇总

    笔记几乎涵盖了日常开发中全部的知识点以及相关注意事项 想要学习网页制作的初学者可以通过本篇笔记初步掌握HTML的使用,也可以将该笔记作为查阅资料查看 HTML简单结构 <html> < ...

  9. IdentityServer4 学习笔记[2]-用户名密码验证

    回顾 上一篇介绍了IdentityServer4客户端授权的方式,今天来看看IdentityServer4的基于密码验证的方式,与客户端验证相比,主要是配置文件调整一下,让我们来看一下 配置修改 pu ...

随机推荐

  1. 2017.11.8 Noip2017 考前模拟赛

    ----------------------------------T1---------------------------------- ——>足球联赛 题目描述 巴蜀中学新一季的足球联赛开 ...

  2. NetworkX系列教程(9)-线性代数相关

    小书匠 Graph 图论  学过线性代数的都了解矩阵,在矩阵上的文章可做的很多,什么特征矩阵,单位矩阵等.grpah存储可以使用矩阵,比如graph的邻接矩阵,权重矩阵等,这节主要是在等到graph后 ...

  3. WallpaperEngine 导入 mp4 文件出现 failed opening video

    WallpaperEngine 导入 mp4 文件出现 failed opening video 如图 下载这个插件 链接:点击打开链接 密码:dkf8

  4. 数据层面;MySQL查

    AND 运算优先于OR运算执行(通过括号进行强化) count(*) 会得到包含NULL的数据行数:count(<列明>)会得到NULL之外的数据行数 SQL语句的总逻辑:书写顺序 sel ...

  5. jQuery Cookie (内附 上百行的中文使用手册,与 所有的注释中文翻译)

    jQuery Cookie (内附 上百行的中文使用手册,与 所有的注释中文翻译) 博主亲自翻译. 大家多多捧场. 更多资源请点击"查看TA 的资源" .全场通通 2积分. htt ...

  6. Fluent 时间步长【转载】

    转载自:http://blog.sina.com.cn/s/blog_4ada3be301011rjp.html 用FLUENT计算非稳态问题,是不是在计算时必须保证在每个时间步timestep里都要 ...

  7. [ambari环境搭建](未完待续)

    [安装] https://blog.csdn.net/Happy_Sunshine_Boy/article/details/86595945#commentBox https://www.jiansh ...

  8. Java 面向对象(五)

    包装类 什么是包装类 在面向对象当中"一切皆对象".基本数据类型变量不是对象,比如 int a = 10; 当中就没有对象,所以就很矛盾.此时我们就可以对基本数据类型进行包装,把基 ...

  9. 解决问题:OSError: mysql_config not found

    通过pip install mysqlclient时报出了OSError: mysql_config not found错误,如下 Traceback (most recent call last): ...

  10. Tosca Connection Validation error:40 - Could not open a connection to SQL Server (不知道怎么解决)

    谁知道下面这个错怎么解决,请给我留言,谢谢. 数据库能正常链接,服务也是 normal running