查阅了大多数相关资料,总结设计一个IdentityServer4认证授权方案,我们先看理论,后设计方案。

1、快速理解认证授权

我们先看一下网站发起QQ认证授权,授权通过后获取用户头像,昵称的流程。

1、输入账号密码,QQ确认输入了正确的账号密码可以登录 --->认证

2、下面需要勾选的复选框(获取昵称、头像、性别)----->授权 

点击授权并登录后,登录后就可以凭借QQ授权的授权码去获取昵称、头像、性别了。

是不是看起来流程很简单?对,就是这么简单,换成我们自己的网站也是一样的。

比如公司开发出很多业务网站,网站1、网站2、网站3......,然后我们想使用同一个账号登录后,其他网站打开也是登录状态。

这个时候只需要有一个统一认证登录平台(类似于QQ认证授权),然后就可以实现了,避免了一个网站一个账号,每次都需要输入账号密码的情况了。

2、IdentityServer4的概念?

IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID ConnectOAuth 2.0协议的实现。

看下面这张图理解一下这个概念,看不懂?没关系,不影响你敲代码的速度,接着往下看。

对上图各个节点的解释:

IdentityServer

  身份认证服务器是一个实现了OpenID Connect和OAuth 2.0协议的身份提供者,它负责向客户端发布安全令牌

User

  使用注册客户端访问资源的用户

Client

客户端从标识服务器请求令牌,要么用于认证用户(请求身份令牌),要么用于访问资源(请求访问令牌)
        客户端必须首先在身份服务器上注册,然后才能请求令牌
       这里的客户端可以是web应用程序、native mobile, desktop applications, SPA 等程序

Resource
  资源是你想要用身份认证服务器保护的东西,如:用户的身份数据或api
  每个资源都有一个惟一的名称,客户端使用这个名称来指定他们想要访问的资源
  关于用户的身份数据标识(也称为claim),例如姓名或电子邮件地址

Identity Token
  身份令牌代表身份验证过程的结果

Access Token
  访问令牌授权客户端以允许访问哪些API资源,访问令牌包含客户端和用户的信息

2.1、OpenID Connect(认证)

OpenID Connect由OpenID基金会于2014年发布的一个开放标准, 是建立在OAuth 2.0协议上的一个简单的身份标识层, OpenID Connect 兼容 OAuth 2.0. 实现身份认证(Authentication)

参考资料:https://openid.net/connect/

OpenID Connect文档:https://openid.net/specs/openid-connect-discovery-1_0.html

这里用JSON Web Token(JWT:RFC7519),它包含一组关于用户身份的声明(claim),如:用户的标识(sub)、颁发令牌的提供程序的标识符(iss)、创建此标识的Client标识(aud),还包含token的有效期以及其他相关的上下文信息。

2.2、OAuth2.0(授权)

OAuth2.0是一个开放的工业标准的授权协议(Authorization),它允许用户授权让第三方应用直接访问用户在某一个服务中的特定资源,但不提供给第三方账号及密码信息。

参考资料:https://www.cnblogs.com/xiandnc/p/9763121.html

OAuth2.0 文档:https://tools.ietf.org/html/rfc6749#page-73

OAuth2.0四种授权方式:http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

认证是身份识别,鉴别你是谁;

授权是授权许可,告诉你可以做什么。

如上图的网站发起QQ认证授权,登录QQ是认证身份,鉴别你是谁,勾选复选框授权是授权许可,告诉你可以做什么(读取头像,昵称、性别)。

具体概念就不展开了,大家点击上面的参考资料可以了解详细内容,OAuth整体流程如下:

客户端必须得到用户的授权,才能获取令牌。

OAuth2.0定义了四种授权方式(除了这是四种,可以自定义授权模式,如:短信模式、邮箱模式等):

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

2.3、IdentityServer4功能特性

用户认证服务

  基于OpenID Connect实现的独立的认证服务实现对多平台(web, native, mobile, services)的集中认证

API访问授权

  为各种类型的客户机颁发api访问令牌,例如服务器到服务器、web应用程序、spa和native/mobile程序

联合身份认证

  支持外部身份提供者,如Azure Active Directory、Google、Facebook等

定制化的实现

  IdentityServer4的许多方面可以定制以满足您的需要,因为它是一个框架,而不是SaaS服务,所以可以通过编写代码来调整实现,以适应不同的场景

成熟的开原方案

  使用许可的Apache2开源协议,允许在其之上构建商业产品,也作为.NET基金会支持的项目 (https://dotnetfoundation.org/projects?type=project&ps=10&pn=6

提供免费的商业支持

  官方可以对使用者提供部分的免费商业支持

3、场景演示:认证授权系统架构设计方案

电商场景设计方案(初稿)

系统架构图如下:

这张架构图缺点:

  • 发布频繁,发布影响整个系统;
  • 很难做到敏捷开发;
  • 维护性可能会存在一定的弊端,主要看内部架构情况;

大多数对于多客户端登录授权来说可能已经实现了Oauth 2.0 的身份授权验证,但是是和业务集成在一个网关里面,这样不是很好的方式;

我们可以把里面的很多业务单独建立一个独立的网关(比如代理商业务,或者其他比较频繁操作的业务以及第三方业务),并且把授权服务一并独立出来,调整后的系统架构图如下:

身份授权从业务系统中独立出来后,有了如下的优势:

  • 授权服务不受业务的影响,如果业务网关宕机了,那至少不会影响代理商网关的业务授权系统的使用;
  • 授权服务一旦建立,一般就很难进行升级,除非特殊情况;
  • 在敏捷开发中,业务系统可能发布频繁(升级更新),这样也不至于影响了授权系统服务导致代理商业务受到影响;

代理商业务独立后,代理商可能会增加秒杀活动,秒杀时支付订单集中在某一时刻翻了十几倍,这时候整个API网关可能扛不住,

如果数据过多,增加几台负载服务器可能也有点吃力,以至于整个业务系统受到影响;

这个时候把支付业务从系统中拆分出成独立的支付网关,并做了一定的负载,这时候系统架构图就演变成如下:

支付业务独立后的优势:

  • 支付网关服务更新不会太频繁,减少整个系统因为发布导致的一系列问题,增强稳定性;
  • 支付系统出现宕机不影响整个系统的使用,用户还可以使用其他操作,技术和运维人员也比较好排查定位问题所在;

授权中心单独一个网关,访问API网关支付业务网关代理商业务网关都需要先通过授权中心获得授权拿到访问令牌AccessToken 才能正常的访问这些网关,

这样授权模块就不会受任何的业务影响,同时各个业务网关也不需要写同样的授权业务的代码;

业务网关仅仅只需关注本身的业务即可,授权中心仅仅只需要关注维护授权;

经过这样升级改造后整个系统维护性得到很大的提高,相关的业务也可以针对具体情况进行选择性的扩容。

参考文献

Asp.Net Core IdentityServer4 中的基本概念:https://www.cnblogs.com/jlion/p/12437441.html

IdentityServer4+Vue+asp.netcore开源项目地址:https://www.cnblogs.com/WQLBlog/p/12356853.html

Asp.Net Core 中IdentityServer4 授权中心之应用实战:https://www.cnblogs.com/jlion/p/12447081.html

基于IdentityServer4 实现.NET Core的认证授权:https://www.cnblogs.com/xiandnc/p/10150814.html

 
欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取

作者:熊泽-学习中的苦与乐
公众号:熊泽有话说


出处: https://www.cnblogs.com/xiongze520/p/15543795.html



您可以随意转载、摘录,但请在文章内注明作者和原文链接。

一看就懂的IdentityServer4认证授权设计方案的更多相关文章

  1. 基于IdentityServer4 实现.NET Core的认证授权

    IdentityServer4是什么? IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. OpenID ...

  2. .net core gRPC与IdentityServer4集成认证授权

    前言 随着.net core3.0的正式发布,gRPC服务被集成到了VS2019.本文主要演示如何对gRPC的服务进行认证授权. 分析 目前.net core使用最广的认证授权组件是基于OAuth2. ...

  3. 认证授权:IdentityServer4

    前言 上一篇文章<学习OIDC>介绍了OIDC协议,本篇开始我们就来具体来学习OIDC的具体实现IdentityServer4 学习. 一.IdentityServer4 是什么? Ide ...

  4. 一次看懂 Https 证书认证

    TLS 传输层安全性协定 TLS(Transport Layer Security),及其前身安全套接层 SSL(Secure Sockets Layer)是一种安全协议,目的是为网际网路通信,提供安 ...

  5. 使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  6. [2014-11-11]使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  7. [认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分)

    在上一篇[认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)中解释了OIDC的核心部分的功能,即OIDC如何提供id token来用于认证.由于OIDC是一个协议族,如果 ...

  8. [认证授权] 5.OIDC(OpenId Connect)身份认证(扩展部分)

    在上一篇[认证授权] 4.OIDC(OpenId Connect)身份认证(核心部分)中解释了OIDC的核心部分的功能,即OIDC如何提供id token来用于认证.由于OIDC是一个协议族,如果只是 ...

  9. 一站式WebAPI与认证授权服务

    保护WEBAPI有哪些方法? 微软官方文档推荐了好几个: Azure Active Directory Azure Active Directory B2C (Azure AD B2C)] Ident ...

随机推荐

  1. Python实现一个简单三层神经网络的搭建并测试

    python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...

  2. 解决Vue项目打包之后放到nginx下刷新就报错404的问题

    最近跟着某机构的教学视频敲了一遍vue项目,但是在windows环境下部署的时候就懵逼了放到nginx下正常跑没问题,但是刷新之后就报404错误 前端项目构建vue 脚手架版本 是@vue/cli 4 ...

  3. 踩坑系列《四》a标签的href属性拼接问题

    如上所示,无法直接在 html里面的 a 标签的href属性传递参数时,只需要在 JS 中获取对应 a 标签的id,再通过 attr 方法抓到 href,进行字符串拼接即可

  4. Dapr + .NET Core实战(十一)单机Dapr集群

    如何单机部署Dapr集群 第十篇讲过了K8S集群下如何使用Dapr运行程序,但是很多人一直在问如何单机下进行Dapr的负载,这节课我们来聊聊如何单机进行Dapr的负载. 首先要说的是单机下,通过 da ...

  5. harmony OS 开发工具安装

    harmony OS 开发工具安装 安装流程 安装完成 初始配置 双击打开 Running DevEco Studio requires the npm configuration informati ...

  6. JAR文件

    目录 JAR文件 创建JAR文件 jar程序选项 清单文件 注释 可执行JAR文件 警告 多版本JAR文件 注释 关于命令行选项的说明 警告 警告 JAR文件 在将应用程序打包时,你一定希望只向用户提 ...

  7. 试题 历届试题 核桃的数量 java题解

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: ...

  8. 用 @Value("${xxxx}")注解从配置文件读取值的用法

    1.  用法: 从配置properties文件中读取init.password 的值. @Value("${init.password}") private String init ...

  9. 用C++生成solidity语言描述的buchi自动机的初级经验

    我的项目rvtool(https://github.com/Zeraka/rvtool)中增加了生成solidity语言格式的监控器的模块. solidity特殊之处在于,它是运行在以太坊虚拟机环境中 ...

  10. 新型活跃Mozi样本分析报告

    基本信息 对象 值 文件名 Photo.scr 文件类型 PE32 executable for MS Windows (GUI) Intel 80386 32-bit 文件大小 6271259 by ...