.NET 雲原生架構師訓練營(Identity Server)--學習筆記


目錄

  • 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

課程鏈接

https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

知識共享許可協議

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含鏈接: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改后的作品務必以相同的許可發布。

如有任何疑問,請與我聯系 (MingsonZheng@outlook.com) 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM