簡體   English   中英

受信任桌面客戶端的客戶端憑據流或授權代碼流(使用 PCKE)

[英]Client Credentials Flow or Authorization Code Flow (with PCKE) for a trusted desktop client

我正在為多個 API 開發身份驗證/授權架構。

我使用 IdentityServer4 作為安全令牌服務 (STS)。

根據我從“Dominick Baier”(構建 IdentitySever4 的人之一)中讀到的內容,只有兩種類型的流應該使用

  • 客戶憑證流。 (機器對機器)
  • 授權碼流程 + PCKE。 (對於迭代用戶)。

我有幾個 C# Web API 將與每個(機器對機器)通信,我將使用客戶端憑據流。

但是還有一些 WPF 桌面應用程序需要訪問一些 API,並且沒有用戶。 應該使用哪個流?

我已經讀過:桌面/本機和移動應用程序應該使用授權代碼流(使用公共客戶端和 PKCE),因為它們托管在客戶端,並且客戶端/秘密可能被泄露(可能在桌面上應用程序我們可以加密秘密嗎?但是需要管理一種方法來存儲解密的秘密嗎?)

然后我讀到:“只要您有一個不關心最終用戶身份的系統(並且只需要對系統進行身份驗證),請使用 OAuth2 客戶端憑據授予。”

目前,這是我的情況,我不關心最終用戶的身份(但也許在不久的將來我會關心)。

因此,由於上述幾點相互沖突: - 我應該使用哪個流程? - 我可以擁有使用客戶端憑據流的桌面客戶端並且安全嗎?

另外,我讀過一些關於 Mutual TLS 的文章,如果我使用它,這會改變我應該使用哪個流程嗎?

您不能信任客戶端,因為您無法確定請求來自客戶端。 還有一個問題是客戶不善於保守秘密。 但是有不同類型的客戶。

在服務器上運行的客戶端通常具有單個任務,例如同步與用戶無關的數據,適合使用客戶端憑據流。 在某種程度上,他們可以保守秘密(在服務器上運行)。

您可以為每個實例使用唯一憑據,但這並不能使其更安全。 它可以幫助您識別客戶端,但不會增加安全性。 安全是關於監控行為和檢測異常。 或者可能通過過濾 ip 地址來縮小訪問范圍。

但是您不限於使用您提到的兩個流程。 作為令牌提供者,您可以使用擴展授權擴展 IdentityServer 和自定義流。

如果沒有用戶,客戶端憑據有點類似於資源所有者密碼憑據 (ROPC) 流程(授權類型文檔中不再涵蓋但仍然存在的另一個選項,請參閱舊文檔)。 從兩者都可以自動化的意義上說,兩者都不是真正安全的。 由於這些流程不需要用戶交互,因此可以消除用戶因素。

但我想知道為什么您的應用程序沒有用戶,在用戶機器上運行。 因為理想情況下,您有一個客戶端(沒有秘密),用戶登錄並讓客戶端聯系 api( 委托)。

所以有兩件事:你需要識別客戶嗎? 如果沒有,您可以使用 ApiKey,例如 Sendgrid。 你永遠不能相信客戶。 安全必須是服務器端。

所以基本上這並不重要,你無法做任何事情來讓它更安全的客戶端。 您唯一可以做的就是添加用戶交互的要求。 所以也許現在您不需要它,但它會增加安全性並允許您將 api 訪問權限委托給客戶端。

要添加到 Ruard 的非常好的答案並指向一些鏈接:

對於您的 WPF 桌面應用程序,標准技術是打開系統瀏覽器進行登錄,然后在您的應用程序中接收響應。 這有點棘手,但下面的 IdentityModel 代碼示例顯示了如何:

我的資源

不過,用戶體驗有點棘手,所以要了解這種行為,您可能需要查看我的可視化博客文章。

博客文章附有幾個代碼示例,您可以在本地 PC 上輕松運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM