一、前言

今天开始学习Identity Server4,顺便了解下.Net Core,以便于完善技术栈,最主要的是要跟上.Net的发展潮流,顺便帮助各位整理下官方文档,加上一些我自己对他的理解.

这是官方文档的地址

二、简介

1、常见的网站的交互方式如下:

(1)、浏览器与Web应用程序交互。单站点应用程序,一个站点搞定所有的东西,常见的有MVC、WebForm等等,这类一般不存在多客户端之说,因为页面和后台处理程序是强耦合的,也就是说,这个时候我们的后台处理程序只处理对应的页面,不能给其它的诸如IOS、Android等等设备调用,所以没有安全一说.

(2)、Web应用程序(可能是本地的,也可能是远程的)与WebAPI通信(有时是自己的,有时代表用户)。多站点应用程序,这个时候我们通过对业务的聚合提供一套完整的Web API给外界调用,调用者可以是多种设备,比如IOS、Andriod、H5站点等.这个时候就有安全一说,因为这个时候如果你的API公开,不做任何的安全措施,意味着所有知道你接口的应用程序都能调用.这个时候你必须考虑安全问题

(3)、WebApi与WebApi之间的调用,一般用于规模较大的网站,因为当一个站点达到一定规模,势必要对业务进行拆分,将不同的业务通过WebApi部署到不同的站点上,然后各个站点之间进行通信,如果有必要可以进行分布式部署,用Nginx进行负载均衡.这个时候,也必须考虑站点的安全性,因为不能让你的核心业务信任外界任何的调用.

所以,WebApi上的资源安全对我们来说是非常重要的问题,必须保证我门的API受我们的保护,只有经过我们的认证之后,才能进行安全的访问.通常,一般性的解决方法是,首先用户(可以是客户端用户、可以是服务端用户)通过了我们的认证系统,然后我们通过授权的方式,把这个资格开发给它.比如说编写博客这个事情,只有注册了并登陆博客园,才会有这个资格,如果没有注册,那么只能访问博客园的公共资源.当让这个例子不是很确切.

2、关于认证

(1)、简单的认证方式

常见的简单的认证方式一般就是设计一个注册登陆系统,接着给我们的Api接口继承一个基类,基类里面有判断用户是否登陆的操作,这样就确保了我们的Api只有注册并登陆了我们的系统的用户才能访问。但是Api与Api之间的访问总不能也这么设计吧?当然你可以给每个接口约定用户名和密码两个参数,然后给API的调用者分配一个账号密码,让Api在我们控制范围内的接受调用,但是没人会去这么干,而且会存在安全隐患,比如抓包等等,而且系统这么设计也不够优雅,当然你可以说用Https加密,但是这不是本文的重点.

(2)、认证协议

关于为什么要用认证协议请参考Web应用的认证机制常见的认证协议有SAML2p、WS-Federation和OpenIDConnect-SAML2p,它们是最流行和部署最广泛的。

(3)、OAuth 2.0认证

OAuth2是一种协议,允许应用程序从安全令牌服务请求访问令牌,并使用它们与API通信。此委托降低了客户端应用程序和api的复杂性.

(4)、OpenID Connect

OpenIDConnect和OAuth2.0非常相似-实际上OpenIDConnect是OAuth2.0之上的一个扩展。两个基本的安全问题,即身份验证和API访问,被组合成一个单一的协议-通常是安全令牌服务进行一次往返。我们认为,OpenIDConnect和OAuth2.0的结合是在可预见的将来保护现代应用程序的最佳方法。Identity yServer 4是这两种协议的实现,并且经过高度优化以解决移动、本地和Web应用程序的典型安全问题。

3、Identity Server4

(1)、简介

Identity Server4是一种中间件,它将符合规范的OpenIDConnect和OAuth2.0端点添加到任意ASP.NETCore应用程序中。也就是说你的移动端、本地应用程序只要符合OpenIDConnect和OAuth2.0协议,且你的ASP.NETCore应用程序也符合,那么他们之间就能进行交互.

(2)、实现认证的方式

MS提供的图,下面简要介绍下:

Users:用户

使用注册客户端并且想要访问资源的人

Client:客户端

客户端是一种软件,它从Identity Server请求令牌,令牌两种第一种请求身份令牌一验证用户身份的标识令牌(下面会介绍)、另一种是访问令牌(下面会介绍)一要求访问资源的令牌。客户端在请求令牌之前必须先在Identity Server注册。客户端的示例包括Web应用程序、本地移动或桌面应用程序、服务器进程等。

Resources:资源

资源是你希望使用Identity保护的资源,一般有两种:一是用户数据、二是Api资源

Identity Data:Identity数据

关于用户的身份数据标识信息,例如姓名或电子邮件地址等用户信息.

Identity Token:验证用户身份的标识令牌

标识令牌表示身份验证过程的结果。它至少包含一个用户标识符(称为Subaka Subject Claimation)和关于用户身份验证的方式和时间的信息。它可以包含其他身份数据。

Access Token:访问令牌

访问令牌允许访问API资源。客户端请求访问令牌并将它们转发给API。访问令牌包含有关客户端和用户的信息(如果存在的话)。API使用该信息来授权对其数据的访问。

那么大致的流程就是这样,首先用户使用客户端,接着客户端注册了Identity,并向Identity申请令牌,接着Identity就开始验证用户信息,通过将用户的信息存储到Identity Data里面,接着通过OpenIDConnect协议与客户端进行对话(向请求头中添加一些必要信息,并进行数据加密等操作),发放Identity Token,如果用户需要访问Api资源,那么去申请Access Token,通过将你的访问令牌(并遵循通OAuth2.0协议,向请求中添加一些必要信息,并进行数据加加密等操作))的同时将你的令牌转发给Api,通过那么就可以正常访问Api。

4、Identity Server4能干的事

当然Indentity能干的事不只是在遵循安全协议的情况下,发送安全令牌这么简单(当然也不简单!).

它还能有效的保护您的资源,并提供会话管理和单点登录管理等等.

Identity Server4学习系列一的更多相关文章

  1. Identity Server4学习系列四之用户名密码获得访问令牌

    1.简介 Identity Server4支持用户名密码模式,允许调用客户端使用用户名密码来获得访问Api资源(遵循Auth 2.0协议)的Access Token,MS可能考虑兼容老的系统,实现了这 ...

  2. Identity Server4学习系列三

    1.简介 在Identity Server4学习系列一和Identity Server4学习系列二之令牌(Token)的概念的基础上,了解了Identity Server4的由来,以及令牌的相关知识, ...

  3. Identity Server4学习系列二之令牌(Token)的概念

    1.简介 通过前文知道了Identity Server4的基本用途,现在必须了解一些实现它的基本细节. 2.关于服务端生成Token令牌 头部(Header): { “typ”: “JWT”, //t ...

  4. EntityFramework Core 学习系列(一)Creating Model

    EntityFramework Core 学习系列(一)Creating Model Getting Started 使用Command Line 来添加 Package  dotnet add pa ...

  5. [eShopOnContainers 学习系列] - 02 - vs 2017 开发环境配置

    [eShopOnContainers 学习系列] - 02 - vs 2017 开发环境配置 https://github.com/dotnet-architecture/eShopOnContain ...

  6. Python学习系列(二)(基础知识)

    Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...

  7. SQL Sever 学习系列之一

    SQL Sever 学习系列之一 本学习系列,从实际工作需要中积累,对于一个新手而言,写出几条漂亮的查询语句,应该是可以受启发的. 一.问题的需求是:员工薪酬发放,现有资金能发放多少人,哪些人应得? ...

  8. 【SQL Server 学习系列】-- sql 随机生成中文名字

    原文:[SQL Server 学习系列]-- sql 随机生成中文名字 ,) )) -- 姓氏 ,) )) -- 名字 INSERT @fName VALUES ('赵'),('钱'),('孙'),( ...

  9. identity server4获取token和userInfo

    一.简介 IdentityServer4(ids4)是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架.在许多成熟的.net core框架中都完美的集成的该身份服务框 ...

随机推荐

  1. DocumentType类型

    并不常用 nodeType 10 nodeName doctype的名称 NodeValue 值为null parentNode Document 不支持子节点 DocumentType不能动态创建, ...

  2. AngularJS实战之Controller之间的通信

    我们时常会在不同controller之间进行通信,接下来就介绍三种controller之间的通信方式 一.使用$on.$emit和$broadcast进行controller通信 虽然AngularJ ...

  3. Python 之 Difflib

    Python 之 Difflib 2017年7月8日 word文档地址:https://wenku.baidu.com/view/36692440854769eae009581b6bd97f19237 ...

  4. 【2】C#读取文本文件

    一.读取

  5. The file left unchanged.

    This files have types: *.___jb_old___ and *.___jb_bak___ The file left unchanged. You can disable &q ...

  6. 视图,sql注入问题,事物,存储过程

    视图:本质是一张虚拟的表数据来自select语句用途是保障原表安全 功能1:隐藏部分数据,开放指定数据功能2:因为视图可以将查询结果保存的特性,我们可以用视图来达到减少书写sql语句的功能 例如:se ...

  7. iOS程序的执行顺序 和 UIViewController的生命周期

    iOS程序的执行顺序 1 进入程序的入口 进入main函数, 设置AppDelegate称为函数的代理 2  程序完成加载 -[AppDelegate application:didFinishLau ...

  8. Fortran编译器之一GUN Fortran安装(Windows XP)

    最近研究GIS算法,需要用到Fortran语言.在网上找了一下发现一个开源的软件GUN Fortran编译器.当然既然是编译器,就是编译出程序的,但是编辑器不包括在内.编辑器可以用Text记事本,或者 ...

  9. noip第9课资料

  10. OpenStack Kilo版加CEPH部署手册

    OpenStack Kilo版加CEPH部署手册 作者: yz联系方式: QQ: 949587200日期: 2015-7-13版本: Kilo 转载地址: http://mp.weixin.qq.co ...