目录

  • OAuth 2.0
  • OpenID Connect
  • QuickStart

OAuth 2.0

  • 概念
  • 过程
  • 通信
  • 组件
  • 示例代码

概念

OAuth 2.0 是一个授权协议,它允许软件应用代表(而不是充当)资源拥有者去访问资源拥有者的资源(如何让一个系统组件获取另一个系统组件的访问权限)

  • 受保护的资源:是资源拥有者有权限访问的组件
  • 资源拥有者:有权访问 API,并能将 API 访问权限委托出去
  • 客户端:凡是使用了受保护资源上的 API,都是客户端

过程

通信

组件

  • 访问令牌 token
  • 权限范围 scope
  • 刷新令牌 refresh token
  • 授权许可 grant_type
grant_type 授权方式 授权前置条件 使用通信信道 说明
authorization_code/PKCE 授权码模式 授权码 前端/后端 客户端通过code在后端与授权服务器进行交互获取令牌
implict(不建议使用) 简化模式
password(不建议使用) 密码模式 用户名/密码 后端 在客户端输入用户名和密码,由客户端向授权服务器获取令牌
client_credentials 客户端模式 后端
device_code 设备码
refresh_token 刷新token 用refresh_token来换取新的token

授权码模式

  1. 第三方应用首先向服务提供商申请 client_id 应用唯一标识、Client_secret 密钥,用于后续获取令牌时提供身份校验

  2. 申请授权码:此时要提供预分配好的 client_id 标识来源,提供 scope 标识要申请的权限,提供 redirect_uri 标识授权完毕后要回跳的第三方应用链接

  3. 第一次 302 重定向:认证服务器展示登录授权页

  4. 第二次 302 重定向:在用户提交授权,认证服务器认证成功后,会分配授权码 code,并重定向回第三方应用的 redirect_uri

  5. (建议第三方应用要根据当前用户会话生成随机且唯一的 state 参数,并且收到授权码时先进行校验,避免 CSRF 攻击)最后,第三方应用会向认证服务器申请令牌 access_token,此时要提供预分配好的 code、client_id、client_secret 以便认证。这一步是在后端之间完成的,对用户不可见。access_token 是有有效期的,过期后需要刷新

  6. 拿到令牌 access_token 后,第三方应用就可以访问资源方,获取所需资源 access_token 相当于用户的 session id

选择正确的许可类型

示例代码

地址:https://github.com/skoruba/IdentityServer4.Admin

OpenID Connect

  • OAuth2.0 的不足之处
  • OIDC 概念

OAuth2.0 的不足之处

OAuth2.0 中的 access_token 就是酒店的房卡,谁都可以拥有房卡,有房卡就可以打开酒店的门,但是房卡上并没有当前使用房卡的用户信息,如果需要知道当前房卡所有人的信息需要单独再向酒店的前台去询问

OIDC 概念

Open ID Connect 1.0 是建立在 OAuth 2.0 之上的一个身份层

https://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthorizationEndpoint

QuickStart

安装模板

dotnet new -i IdentityServer4.Templates

查看模板

dotnet new

使用模板创建

dotnet new is4inmem -n QuickStart

已成功创建模板“IdentityServer4 with In-Memory Stores and Test Users”。

打开项目,启动

点击进入登录页面,使用默认用户登录

登录结果

根据配置文件通过ClientCredentials的方式获取token

// m2m client credentials flow client
new Client
{
ClientId = "m2m.client",
ClientName = "Client Credentials Client", AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets = { new Secret("511536EF-F270-4058-80CA-1C89C192F69A".Sha256()) }, AllowedScopes = { "scope1" }
},

根据配置文件通过Code的方式获取token

// interactive client using code flow + pkce
new Client
{
ClientId = "interactive",
ClientSecrets = { new Secret("49C1A7E1-0C79-4A89-A3D6-A37998FB86B0".Sha256()) }, AllowedGrantTypes = GrantTypes.Code,
RequirePkce = false,
AllowPlainTextPkce = true, RedirectUris = { "https://localhost:44300/signin-oidc" },
FrontChannelLogoutUri = "https://localhost:44300/signout-oidc",
PostLogoutRedirectUris = { "https://localhost:44300/signout-callback-oidc" }, AllowOfflineAccess = true,
AllowedScopes = { "openid", "profile", "scope2" }
},

访问认证接口获取授权码

https://localhost:5001/connect/authorize?client_id=interactive&scope=openid&response_type=code&redirect_uri=https://localhost:44300/signin-oidc&nonce=xyz

返回授权码

https://localhost:44300/signin-oidc?code=BC56FE53D39BD46A5D55D43F485E23D7FF6583FEDD7A2A0B7A2A3DFDF5C52935&scope=openid&session_state=SwfB-jWoQ16C67cm5c_ANqbVE1R50Krj55GuJuArEQ0.BE30A11CD461DC430C5121AEFB4A4E82

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

.NET 云原生架构师训练营(Identity Server)--学习笔记的更多相关文章

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

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  2. .NET 云原生架构师训练营(建立系统观)--学习笔记

    目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...

  3. .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记

    目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...

  4. .NET 云原生架构师训练营(权限系统 代码实现 Identity)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

  5. .NET 云原生架构师训练营(设计原则与模式)--学习笔记

    在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发.和维护的成本 目录 几个问题 为什么要学习设计模式 优良架构设计的具体指标 理解复杂系统 面向对象思想(指导复杂系统的分析.设计.实 ...

  6. .NET 云原生架构师训练营(系统架构)--学习笔记

    目录 对外展现的功能 内部功能 功能交互与价值通路 系统架构 目标 认识系统的价值通路 认识功能架构,通过把功能结构与形式结构结合来描述系统架构 受益原则 好的架构必须使人受益,要想把架构做好,就要专 ...

  7. .NET 云原生架构师训练营(对象过程建模)--学习笔记

    目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展. ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记

    2.4.6 EF Core -- 更新 状态 自动变更检测 不查询删除和更新 并发 状态 Entity State Property State Entity State Added 添加 Uncha ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 敏捷开发)--学习笔记

    2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作, ...

随机推荐

  1. 克鲁斯卡尔(Kruskal)算法(代码)

    算法代码 C#代码 using System; using System.Linq; namespace Kruskal { class Program { static void Main(stri ...

  2. Nifi:初识nifi

    写在前面: 第一次接触这一系统的时候,只有github上的一坨源码和官方的英文文档,用起来只能说是一步一个坑,一踩一个脚印,现在回想那段血泪史,只想 ***,现在用起来算是有了一些经验和总结,这里就做 ...

  3. [刷题] 343 Integer Break

    要求 给定一个正数n,可将其分割成多个数字的和,求让这些数字乘积最大的分割方法(至少分成两个数) 示例 n=2,返回1(2=1+1) n=10,返回36(10=3+3+4) 实现 回溯遍历(n^2,超 ...

  4. [bug] Python Anoconda3 安装完成后开始菜单不显示

    版本问题,需更新 win+R打开cmd,敲入命令: conda update menuinst conda install -f console_shortcut ipython ipython-no ...

  5. 使用 IPMI 远程为服务器安装操作系统教程

    使用 IPMI 远程为服务器安装操作系统教程 shida_csdn 2019-01-09 11:30:10 9588 收藏 16展开一.什么是 IPMI? IPMI 是智能平台管理接口(Intelli ...

  6. ValueError: not enough values to unpack (expected 2, got 1)

    在python中使用字符串分片时遇到这个问题 [ValueError: not enough values to unpack (expected 2, got 1)] --------------& ...

  7. shell 读取某个目录下的所有文件

    #!/bin/shFILE_PATH="xxx" xxx:路径cd $FILE_PATHfor FILE in `ls` do echo $FILE done

  8. nosql数据库之Redis概念及基本操作

    一.概述 redis是一种nosql数据库(非关系型数据库),他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(st ...

  9. 9.2-3 pstree & pgrep

    9.2 pstree:显示进程状态树     pstree命令以树形结构显示进程和进程之间的关系.     如果不指定进程的PID号,或者不指定用户名称,则会以init进程为根进程,显示系统的所有进程 ...

  10. vue 表格中的下拉框单选、多选处理

    最近在用vue做前后端分离,需要在表格中用到下拉框,由于需求变动,从最开始的单选变为多选,折腾了许久,记录一下,供后人铺路 vue 中的表格下拉框单选 collectionsColnumOptions ...