簡體   English   中英

UWP/WinUI 桌面應用程序訪問 Azure Key Vault 機密

[英]UWP/WinUI desktop app access to Azure Key Vault secrets

Microsoft 提供了多種方法來安全訪問 Azure Key Vault 機密,特別是使用托管身份或服務主體作為身份提供者。 但是,這些方法明確設計用於基於 Azure 的資源,例如 web 應用程序和微服務。 它們不適用於 UWP/WinUI 桌面應用程序。

到目前為止,我發現允許 UWP/WinUI 桌面應用程序訪問 Key Vault 的唯一方法是將應用程序的 Azure 注冊信息(TenentId、ClientId 和 ClientSecret -- 秘密,它們自己)加載到環境變量中,這些信息由創建新的 SecretClient object (Azure.Security.KeyVault.Secrets) 時的 DefaultAzureCredential() 方法。

但這意味着我需要將這些秘密存儲在代碼或配置文件中,以便在運行時讀取。 絕對不是最佳實踐。 我肯定錯過了什么。

在 2020 年,UWP/WinUI 桌面應用程序安全訪問 Key Vault 機密的最佳做法是什么——而不會在此過程中暴露其他機密?

歸根結底,您的應用程序必須存儲某種秘密——因為它需要將該秘密提供給您的 Key Vault 實例,以證明該應用程序確實可以訪問存儲在該保管庫中的秘密。 它類似於從數據庫中檢索值 - 您必須先存儲並提供連接字符串,然后才能獲取值。

如果不知道您打算如何部署應用程序的特定用例,就不可能建議您應該做什么或不應該做什么。 在我們的例子中,我們有一個 WinForms 應用程序,它由我們的支持團隊明確安裝到我們客戶的機器上,這意味着我們一直在使用客戶證書的舊黃金標准 - 顯然有一個自定義驗證步驟.

值得慶幸的是, Key Vault 明確支持客戶端證書(以下步驟從鏈接的 MSDN 復制):

  1. 創建 PKCS#12 存檔 (.pfx) 證書。 創建證書的選項包括 Windows 和 OpenSSL 上的 MakeCert。
  2. 將證書安裝到當前用戶的個人證書存儲中。 將密鑰標記為可導出是可選的。 記下證書的指紋,稍后將在此過程中使用。
  3. 將 PKCS#12 存檔 (.pfx) 證書導出為 DER 編碼證書 (.cer)。
  4. 使用 Azure AD(應用程序注冊)注冊應用程序。
  5. 將 DER 編碼證書 (.cer) 上傳到 Azure AD:
    一種。 Select 公元 Azure 中的應用程序。
    b. 導航到證書和機密。
    c. Select Upload certificate 上傳證書,其中包含公鑰。 可接受 A.cer、.pem 或 .crt 證書。
  6. 將密鑰保管庫名稱、應用程序 ID 和證書指紋存儲在應用程序的 appsettings.json 文件中。
  7. 導航到 Azure 門戶中的密鑰保管庫。
  8. Select 您在生產環境的秘密存儲中使用 Azure 密鑰保管庫部分創建的密鑰保管庫。
  9. Select 訪問策略。
  10. Select 添加訪問策略。
  11. 打開 Secret permissions 並為應用程序提供 Get 和 List 權限。
  12. Select Select 主體和 select 按名稱注冊的應用程序。 Select Select 按鈕。
  13. Select 好的。
  14. Select 保存。
  15. 部署應用程序。

我們目前正在用 Key Vault 替換我們的自定義客戶端證書驗證器,因為它只會讓一切變得更容易 - 從 Azure 門戶而不是我們的自定義管理應用程序管理證書和吊銷。

我需要將這些秘密存儲在代碼或配置文件中,以便在運行時讀取

您可以將 Azure 注冊信息(TenentId、ClientId 和 ClientSecret)設置到 Secret manager 中並讀取值而不是暴露秘密。

請參考以下步驟:

1.啟用安全管理器。 您需要通過在項目目錄上運行來使用 init 關鍵字。

dotnet user-secrets init

這將在項目.csproj文件中為UserSecretId創建 Guid。

在此處輸入圖像描述

2.設置秘密。 您可以使用 set 關鍵字設置秘密

dotnet user-secrets set tenantId "xxxxxxxxxxxx"

在此處輸入圖像描述

3.在代碼中讀取secret manager。

private readonly IConfiguration _configuration;

public WeatherForecastController( IConfiguration configuration)
{
    _configuration = configuration;
}
string keyVaultUrl = "https://xxxx.vault.azure.net";
TokenCredential credential = new DefaultAzureCredential();
credential = new ClientSecretCredential(_configuration["tenantId"], _configuration["clientId"], _configuration["clientSecret"]);

var secretClient = new SecretClient(new Uri(keyVaultUrl), credential);
KeyVaultSecret secret = secretClient.GetSecret("xxxx");
var secretvalue = secret.Value;

工作 output 如下:

在此處輸入圖像描述

有關 Secret Manager 的更多詳細信息,您可以參考這篇文章

暫無
暫無

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

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