目录

  • OAuth 2.0
  • OpenID Connect
  • QuickStart

OAuth 2.0

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

概念

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

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

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

过程

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

通信

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

组件

  • 访问令牌 token
  • 权限范围 scope
  • 刷新令牌 refresh token
  • 授权许可 grant_type

授权码模式

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

  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

选择正确的许可类型

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

示例代码

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

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

OpenID Connect

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

OAuth2.0 的不足之处

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

OIDC 概念

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

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”。

打开项目,启动

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

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

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

登录结果

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

根据配置文件通过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" }
},

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

根据配置文件通过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

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

.NET 云原生架构师训练营(Identity Server)--学习笔记-LMLPHP

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

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

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

07-02 10:50