【譯】在 Visual Studio 2022 中安全地在 HTTP 請求中使用機密

2023-09-11 09:00:46

  在 Visual Studio 2022 的17.8 Preview 1版本中,我們更新了 HTTP 檔案編輯器,使您能夠外部化變數,從而使跨不同環境的 Web API 測試更容易。此更新還包括以安全方式處理 secret 的支援。要存取這些新功能,您需要安裝17.8 Preview 1或更高版本。

  在以前的版本中,如果你想在 Visual Studio 的 HTTP 檔案中使用一個變數,這個變數必須直接在 HTTP 檔案本身中定義。這使得使用相同的 HTTP 檔案測試不同的環境變得更加困難,並且也使得使用需要 secret 的 Web API 變得困難。在這篇文章中,你將學習如何在外部檔案中定義變數,然後在不同的 HTTP 檔案中重用這些變數。您還將瞭解保護您的 secret 並在 HTTP 檔案中以安全的方式重用這些 secret 的不同方法。在討論 secret 支援之前,讓我們先看一下環境檔案支援。

環境檔案概述

  在 Visual Studio 2022 中處理 HTTP 檔案時,您可以定義多個 HTTP 請求,這些請求可以在 IDE 中執行。在以前的版本中,您可以定義可以在整個檔案中使用的變數。在這個版本中,您可以外部化變數,這樣您就可以定義要使用的不同的值和環境的集合。這也使您能夠跨不同的 HTTP 檔案使用相同的環境。

  為了支援不同的環境,您可以新增一個檔名為 httpenv.json 的 HTTP 請求環境檔案。您也可以在 httpenv.json.user 檔案中儲存特定於使用者的值,但我們將在本文後面討論這個問題。在我們接觸 httpenv. json 之前,讓我們看一個定義了幾個請求的小 HTTP 檔案。

@TemplatesApi_HostAddress = localhost:44320
@searchTerm=api
@templatePackId=MadsKristensen.AspNetCore.Miniblog
@numToSkip=5
@numToTake=2

GET https://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}
###
GET https://{{TemplatesApi_HostAddress}}/api/templatepack/{{templatePackId}}
###
GET https://{{TemplatesApi_HostAddress}}/api/templatepack/{{numToSkip}}/{{numToTake}}
###

  在這個檔案中,您可以看到我們定義了幾個變數,以@開頭的行定義了這些變數。因為這些變數是在檔案中定義的,所以在不同的環境中執行這個應用程式可能會很困難。例如,如果我們想測試在本地執行的 API,我們將使用 localhost 地址。如果測試一個已經發布到公共終結點的應用,我們可能想要使用一個公共 URL 而不是 localhost。讓我們看一下這個範例中定義的第一個請求。

GET https://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}
###

   在此請求中,我們使用以下變數。

  * TemplatesApi_HostAddress

  * searchTerm

  這兩個變數都已在此檔案的頂部定義。如果我們在 HTTP 編輯器中傳送請求,這些變數的值將始終是檔案中定義的值。現在我們要將這兩個變數外部化,以便我們可以在不同的環境中測試 API。我們將建立一個名為 httpenv.json 的檔案。此檔案應位於 API 專案的專案檔案所在的同一資料夾中,或位於其上方的資料夾中。當在 httpenv.json 所在的資料夾中或更高位置找到名為 httpenv.json 的檔案時,Visual Studio 將停止搜尋該檔案。將檢測並使用離 httpenv.json 檔案最近的檔案。在本例中,我將 httpenv.json  新增到專案資料夾,檔案內容如下:

{
  "dev": {
    "TemplatesApi_HostAddress": "localhost:44320",
    "searchTerm": "wpf"
  },
  "remote": {
    "TemplatesApi_HostAddress": "dotnetnew-api.azurewebsites.net",
    "searchTerm": "mads"
  }
}

  在 httpenv. json 檔案中,我們定義了兩個不同的環境,dev 和 remote。這兩個環境都定義了我們上面討論的兩個變數。您可以在這些檔案中定義任意數量的環境。在編輯完 httpenv. json 檔案之後。您可能需要重新載入或編輯 HTTP 檔案,以便發現環境檔案。新增此檔案後,您應該看到環境下拉式選單中填充了檔案中定義的環境。如下圖所示。

  在上面的截圖中,您可以看到處於展開狀態的環境選擇器。您可以看到兩個環境,dev 和 remote。讓我們從選擇 dev 環境開始。您可以使用鍵盤快捷鍵 F6 存取 HTTP 編輯器中的環境選擇器。現在我們已經在環境檔案中定義了這兩個變數,您應該從 HTTP 檔案中刪除它們。直接在 HTTP 檔案中定義的變數總是優先於在環境檔案中定義的變數。讓我們將環境切換到 remote,並在 HTTP 檔案中傳送第一個請求。下面是傳送請求後 Response View 的 Request 索引標籤。

  在上圖中,重要的部分被突出顯示。您將注意到所選的環境是 remote 的。從 Request 索引標籤上顯示的完整 URL 中,我們可以看到 TemplatesApi_HostAddress 的的值是 dotnetnew-api.azurewebsites.net ,searchTerm 的值是 wpf。對於HTTP檔案中的第一個請求,我們現在可以輕鬆地從使用本地主機地址的開發環境切換到使用公共 URL 的遠端環境。現在我們可以將其他變數移到環境檔案中,這樣我們就不會在該檔案中寫死任何值。更新後的 HTTP 檔案和 httpenv. json 檔案如下所示。

  HTTP檔案:

GET https://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}
###

GET https://{{TemplatesApi_HostAddress}}/api/templatepack/{{templatePackId}}
###

GET https://{{TemplatesApi_HostAddress}}/api/templatepack/{{numToSkip}}/{{numToTake}}
###

  httpenv.json檔案:

{
  "dev": {
    "TemplatesApi_HostAddress": "localhost:44320",
    "searchTerm": "wpf",
    "templatePackId": "Boxed.Templates",
    "numToSkip": "3",
    "numToTake": "2"
  },
  "remote": {
    "TemplatesApi_HostAddress": "dotnetnew-api.azurewebsites.net",
    "searchTerm": "wpf",
    "templatePackId": "Boxed.Templates",
    "numToSkip": "50",
    "numToTake": "6"
  }
}

  如上所示,我們刪除了在 HTTP 檔案中定義的所有變數,並在  httpenv.json 的兩個環境中定義了它們。HTTP 編輯器將記住最後使用的環境。如果您切換到一個沒有 HTTP 檔案中使用的變數的環境,您將在 HTTP 編輯器中收到一條警告。如果沒有選擇環境,但是 HTTP 檔案使用了 HTTP 檔案中沒有定義的變數,也可能發生這種情況。要檢視實際效果,請將環境切換為 none,如下面的螢幕截圖所示。

  在前面的螢幕截圖中,您可以看到 HTTP 編輯器生成的警告。在本例中,遊標懸停在 TemplatesApi_HostAddress 變數用法上。這裡顯示了兩個警告,一個是未定義所使用的變數,另一個表示 URL 對 HTTP 請求無效。檔案中的後續請求顯示類似的警告。當您從下拉式選單中選擇一個環境時,警告將消失。讓我們繼續討論使用者特定的設定。

使用者特定設定

  在發出 Web API 請求時,您可能需要定義特定於使用者且不打算與團隊共用的某些變數。這與我們即將討論的使用 secret 不同。使用者特定值是開發人員個人想要測試但不想與團隊共用的任何值。預設情況下將簽入 httpenv. json,因此不適合向該檔案新增使用者特定的值。相反,您可以建立一個名為 httpenv.json.user 的檔案,該檔案與 httpenv.json 位於同一個資料夾中。在使用 Visual Studio 原始碼控制特性時,預設情況下,以 .user 結尾的檔案應該從原始碼控制中排除。當 httpenv. json 檔案被載入,它將尋找一個同級的 httpenv.json.user 檔案。如果一個變數是在一個環境中在 httpenv. json 檔案和 httpenv. json.user 檔案中同時定義,那麼 httpenv. json.user 檔案中的值將勝出。

  讓我們在前面的範例的基礎上進行構建,在前面的範例中,我們有一個 dev 和 remote 環境,我們定義了要使用的 searchTerm。假設你是一名開發人員,正在調查處理路由為 api/search 的 API 中的一個 bug。只有當 searchTerm 設定為「maui」時才會出現該錯誤。在這種情況下,您希望為 searchTerm 傳送「maui」,但不能更改 httpenv. json 中的值,否則會影響您的團隊。我們將新增一個名為 httpenv.json.user 的新檔案,該檔案與 httpenv.json 檔案位於同一個資料夾中。在該檔案中,我們將在 dev 環境中定義 searchTerm 值。下面可以看到本例中 httpenv.json.user 檔案的內容。

{
  "dev": {
    "searchTerm": "maui"
  }
}

  在 httpenv.json.user 檔案中,我們已經為 dev 環境中的 searchTerm 定義了新的值。我們只定義了想要覆蓋的特定項的值。因為我們只在 dev 環境中需要這個值,所以不需要定義任何其他值。我們也不需要定義 httpenv. json 中出現的任何其他值。您還可以在 httpenv.json.user 檔案中新增 httpenv. json 檔案中不存在的變數和環境。讓我們看看傳送此請求後的結果。Response View 中的 Request 索引標籤如下所示。

  在上圖中,我們可以看到 searchTerm 的值是「maui」而不是「wpf」。擴充套件下,您還可以根據需要在使用者檔案中定義其他值。如前所述,.user 檔案應該排除在原始碼控制之外,但在提交更改之前還是應該仔細檢查下。

  變數使用的優先順序如下。一旦找到匹配值,將使用該值,而忽略其他源。

  1. HTTP 檔案中宣告的變數

  2. httpenv.json.user檔案中宣告的變數

  3. httpenv. json檔案中宣告的變數

  在跨多個環境工作時,最好避免在 HTTP 檔案中宣告變數,除非您確定這些值不會改變。現在我們已經介紹了特定於使用者的值,讓我們看看如何在 HTTP 請求中以安全的方式使用 secret。

使用機密

  在使用 Web API 時,通常需要在請求中使用 secret。為了以安全的方式支援 secret,我們新增了以三種不同方式存取secret的支援。

  1. ASP. NET Core User Secrets 中的 secret

  2. 用 Windows DPAPI 加密的 secret

  3. Azure Key Vault 中的 secret

  當使用 secret 時,secret 的後設資料可以放在 httpenv.json.user 檔案中,也可以放在 httpenv. json 檔案中。在上面列出的三個提供程式中,唯一一個對團隊友好的是 Azure Key Vault。另外兩個提供程式是特定於使用者的,它們應該在 httpenv.json.user 檔案中宣告。讓我們看看如何定義這些 secret 。我們將檢視上面列出的每個提供者。

ASP. NET Core User Secrets 中的 secret

  在開發中使用 secret 時,一種選擇是使用 ASP. NET Core User Secrets。假設你在 user secrets 中有一個名為「config:templatesApiKeyDev」的 secret。要使用來自 user secrets 的值,HTTP 環境檔案需要與您正在使用的 ASP. NET Core 專案位於同一個資料夾中。使用 httpenv. json 或 httpenv.json.user 檔案中 user secrets 中定義的值。使用以下語法定義一個名為「templatesApiKey」的新變數。下面是我們之前使用的 httpenv.json.user 檔案的更新版本。

{
  "dev": {
    "searchTerm": "maui",
    "templatesApiKey": {
      "provider": "AspnetUserSecrets",
      "secretName": "config:templatesApiKeyDev"
    }
  }
}

  在這裡,我們定義了一個名為 templatesApiKey 的新變數,並將其設定為查詢 user secrets 中的 secret 。它使用一個屬性,provider,決定如何查詢 secret。目前我們支援 provider 的三個值,如下所示。

  * AspnetUserSecrets

  * AzureKeyVault

  * Encrypted

  我們將在下面探討這個值的其他選項。這目前是不可延伸的,但如果你有興趣擴充套件它,請告訴我們。

  回到 AspnetUserSecrets 範例,要在 HTTP 檔案中使用該變數,請像參照標準變數一樣參照它。當您在 HTTP 檔案中鍵入時,您應該在 Completion 列表中看到該變數及其值。請看下面的圖片。

  在影象中,您可以看到 completion 列表中的變數。注意:在這個預覽中,我們也顯示了 secret 值,但它將在即將到來的更新中被遮蔽。新增到 HTTP 檔案中的請求如下所示。

GET https://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}
X-API-KEY: {{templatesApiKey}}

###

  傳送此請求後,我們可以在 Response View 的 Request 索引標籤上檢查傳入的報頭的值。結果如下圖所示。

  正如預期的那樣,當傳送請求時,X-API-KEY 報頭的值是預期的 value-from-user-secrets。現在我們已經看到了如何在 HTTP 檔案中使用來自 user secrets 的值。現在讓我們看看 Azure Key Vault 提供程式。

Azure Key Vault 中的 secret

  Azure Key Vault 是 Azure 中幾個金鑰管理解決方案之一,可用於 secret 管理以及安全管理其他工件。對於 HTTP 環境檔案中當前支援的 secret 儲存,Key Vault 是跨不同使用者共用 secret 的最佳選擇。另外兩個選項不容易共用。要使用 Azure Key Vault 中的值,我們需要定義一個新變數,並新增正確的後設資料來存取該 secret。下面你會看到一個更新版本的httpenv.json.user 檔案,它有一個新的變數,從 Azure Key Vault 獲取它的值。

{
  "dev": {
    "searchTerm": "maui",
    "templatesApiKey": {
      "provider": "AspnetUserSecrets",
      "secretName": "config:templatesApiKeyDev"
    },
    "otherSecret": {
      "provider": "AzureKeyVault",
      "keyVaultName": "sayedapi-keyvault-01",
      "secretName": "SayedSecretValue1",
      "resourceId": "/subscriptions/21e74a87-523d-4a15-87e9-8c5eb2df7716/resourceGroups/sayed-api-demo1"
    }
  }
}

  在上面的 JSON 檔案中,我們定義了一個新變數 otherSecret,它從 Azure Key Vault 中提取其值。在 otherSecret 上定義的屬性總結如下。

Name

Description

provider

對於 Key Vault 總是使用 AzureKeyVault。

keyVaultName

包含 secret 的 Key Vault 名稱。

注意:在將來的更新中,此屬性可能不會被刪除。

secretName

要提取的 secret 的名稱。

resourceId

要存取的特定 Key Vault 的 Azure Resource Id。

  您可以在 Azure Portal 中找到 keyVaultName 和 resourceId 的值。找到包含要使用的 secret 的 Key Vault 。然後點選 Settings >  Properties 來查詢要使用的名稱和 resourceId。對於 secretName,就是您在 Azure Portal 的 Secrets 頁面上找到的 secret 的名稱。要存取 Azure Key Vault 中的 secret,您必須使用有權存取給定 Key Vault 的帳戶登入 Visual Studio。現在我們已經討論了對 Key Vault secrets 的支援,讓我們看看它的實際操作。下面是新增到 HTTP 檔案中的新請求,以使用此 secret 值。注意:Azure Key Vault 章節中的屬性可能會在將來的更新中更改。

GET https://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}
X-CUSTOM-SECRET: {{otherSecret}}
###

  在這個請求中,我們傳遞了一個自定義頭 X-CUSTOM-SECRET,並從 otherSecret 填充它的值。當傳送此請求時,我們可以檢視 Response View 中的 Request 索引標籤,以檢視此檔頭的值。如下圖所示。

  在上面的螢幕截圖中,我們可以看到 X-CUSTOM-HEADER 的值被設定為 super-secret-here,這是儲存在 Key Vault 中的值。現在我們已經討論了對 Azure Key Vault 的支援,讓我們繼續討論剩下的唯一 secret  支援。

用 Windows DPAPI 加密的 secret

  當在 Windows 上工作時,有一個 Data Protection API,又名 DPAPI,可用於加密敏感資料。這是一種常用的加密值的方法,被許多不同的應用程式使用,包括微軟提供的應用程式。在 Visual Studio 中,當您建立 Web 釋出組態檔(publish profile)時,密碼將使用 Data Protection API 加密並儲存在 .user 檔案中。當使用 DPAPI 加密值時,加密的值始終是特定於機器的,在這種情況下,它也是特定於使用者的。這些值不能與其他使用者共用。下面是 httpenv.json.user 檔案的更新版本,它現在包含了一個用 DPAPI 加密的 secret。

{
  "dev": {
    "searchTerm": "maui",
    "templatesApiKey": {
      "provider": "AspnetUserSecrets",
      "secretName": "config:templatesApiKeyDev"
    },
    "otherSecret": {
      "provider": "AzureKeyVault",
      "keyVaultName": "sayedapi-keyvault-01",
      "secretName": "SayedSecretValue1",
      "resourceId": "/subscriptions/21e74a87-523d-4a15-87e9-8c5eb2df7716/resourceGroups/sayed-api-demo1"
    },
    "secretValue": {
      "provider": "Encrypted",
      "value": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA5qwfg4+Bhk2nsy6ujgg3GAAAAAACAAAAAAAQZgAAAAEAACAAAAAqNXhXc098k1TtKmaI4cUAbJVALMVP1zOR7mhC1RBJegAAAAAOgAAAAAIAACAAAABKu4E9WC/zX5LYZZhOS2pukxMTF9R4yS+XA9HoYF98GzAAAAAzFXatt461ZnVeUWgOV8M/DkqNviWUUjexAXOF/JfpJMw/CdsizQyESus2QjsCtZlAAAAAL7ns3u9mEk6wSMIn+KNsW/vdAw51OaI+HPVrt5vFvXRilTtvGbU/JnxsoIHj0Z7OOxlwOSg1Qdn60zEqmlFJBg=="
    }
  }
}

  最後一個條目是我們在這裡討論的。provider 的值是 Encrypted, value 的值是加密的字串。我們目前不支援加密值,但我們將很快新增支援。同時,使用 Data Protection API 對值進行加密非常容易。下面顯示了加密該值的範例控制檯應用程式。

using System.Security.Cryptography;
using System.Text;

string stringToEncrypt = "Hello, World!";
byte[] encBytes = ProtectedData.Protect(Encoding.Unicode.GetBytes(stringToEncrypt), optionalEntropy: null, scope: DataProtectionScope.CurrentUser);
string base64 = Convert.ToBase64String(encBytes);
Console.WriteLine(base64);

  上面的控制檯應用程式需要參照 System.Security.Cryptography.ProtectedData NuGet 包。要使加密值在 HTTP 檔案中工作,必須將 scope 設定為 DataProtectionScope.CurrentUser 進行加密。稍後,我們將在 Visual Studio 2022 中新增支援,以便您不必手動加密這些值。現在我們已經用新的 secret 填充了 httpenv.json.user 檔案,我們可以像處理其他兩個 secret 一樣使用它。使用此 secret 的新請求如下所示。

GET https://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}
X-CUSTOM-SECRET: {{secretValue}}

###

  當我們傳送此請求時,自定義報頭的值將顯示在 Response View 的 Request 索引標籤上。見下圖。

  我們可以看到 secret 值按預期傳遞進來。既然我們已經討論瞭如何在 HTTP 請求和 secrets 中使用機密,那麼讓我們繼續討論在此版本中新增到 HTTP 編輯器中的其他一些特性。

新的 HTTP 檔案語法支援

  在我上一篇關於 HTTP 編輯器的博文中,我們提到在 VS Code REST Client extension 中仍然有很多 HTTP 檔案支援的語法,而這些語法在 Visual Studio 2022 中是不支援的。在這個版本中,我們增加了一些對額外語法的支援。下面列出了支援的新語法。

函數

描述

$randomInt

生成一個隨機整數。

呼叫時的格式為{{$randomInt [min max]}},其中 min 和 max 值是可選的。

注意:我們目前有一個 bug,當指定最小值和最大值時總是返回最大值。這將在即將釋出的版本中得到修復。

$datetime

生成一個日期時間字串。支援的格式包括 ISO8601、RFC1123或自定義格式。

呼叫時的格式為{{$datetime rfc1123|iso8601|「custom format」 [offset option]}}。

$timestamp

生成 UTC 時間戳。預設行為從當前時間生成時間戳。使用選項,您可以生成偏移時間戳。

呼叫時的格式為{{$timestamp [offset option]}}。

$localdatetime

在您的本地時區生成一個日期時間字串。

呼叫時的格式為{{$localdatetime rfc1123|iso8601|「custom format」 [offset option]}}。

$processenv

返回提供的程序環境變數的值。

使用時的格式為{{$processEnv envVarName}}。

$dotenv

返回 .env 檔案中提供的變數的值。

使用時的格式為{{$dotenv variableName}}。

  這些是特殊的變數宣告,將使用給定的引數生成一個值。我們將先看前四個,然後介紹剩下的兩個。以下一些請求將使用免費的開源網站 httpbin.org。這是一個第三方網站,不隸屬於微軟。這是一個很好的網站,可以幫助您 API 開發。看看主頁,除了我在這裡展示的,你還可以使用這個很棒的資源做更多事情。下面的請求顯示了上表中前四個函數的一些範例。

GET https://httpbin.org/headers
X-1RandomInt: {{$randomInt}}
X-2DateTime: {{$datetime iso8601}} 
X-3DateTime: {{$datetime rfc1123}} 
X-4DateTime: {{$datetime rfc1123 1 d}} 
X-5DateTime: {{$datetime "dd-MM-yyyy" 1 y}}
X-6TimeStamp:{{$timestamp}}
X-7TimeStamp:{{$timestamp 1 y}}
X-8LocalDateTime: {{$localDatetime rfc1123}}
X-9LocalDateTime: {{$localDatetime iso8601}}
X-10LocalDateTime: {{$localDatetime iso8601 1 y}}

###

  在我們討論這個請求所做的一切之前,讓我們快速檢視一下這個請求的結果。結果如下。

  在這個範例中,我呼叫特殊變數來生成值,然後將它們傳遞到請求頭中。我這樣做是因為這是最好的演示方式。您還可以將這些值傳遞到請求體中。

  我們可以看到 X-1RandomInt 的值是一個隨機整數。當呼叫 $randomInt 時,你可以指定一個最小最大值,就像這個例子{{$randomInt 1 100}},它應該生成一個從1(包括)到100(不包括)的隨機整數。不幸的是,我們在這個預覽版中有一個 bug,這個語法總是返回指定的最大值。這就是為什麼我沒有在上面的範例請求中包含一個範例。我們將在即將到來的預覽版中修復這個問題。

  在某些情況下,您可能需要生成一個基於當前日期時間的日期時間,並指定時間偏移量。你可以使用 option/offset。考慮範例{{$datetime rfc1123 1 d}},它表示返回當前日期時間偏移1天。在上面顯示響應的影象中,您可以看到返回的值比之前沒有指定任何 option/offset 的前一天。

  當使用 $datetime 生成日期時間字串時,我們需要指定要返回的字串的格式,ISO8601 或 RFC1123。格式化字串是必需的。這將以指定的格式返回當前日期時間。您還可以使用 offset 和 option 引數生成一個 datetime 字串,該字串是當前時間的偏移量。offset 的值應該是一個整數,option 引數的值如下表所示。

Option

描述

y

Year

M

Month

w

Week

d

Day

h

Hour

m

Minute

s

Second

ms

Millisecond

  datetime 變數中選項的這些值與其他 datetime 函數的值相同。考慮這個範例{{$datetime " dd-MM-yyyy " 1 y}},在這種情況下,將從傳送請求的時間開始生成1年的日期時間,並將以 dd-MM-yyyy 格式返回。注意:在當前預覽中,除了 M(Month) 之外,您應該使用小寫字串作為選項。在以後的版本中,這可能會改變。

  時間戳是 Unix 時間戳(DateTimeOffset.ToUnixTimeSeconds())

  $localdatetime 類似於 $datetime,不同之處在於 $localdatetime 返回當前本地時區的日期時間。$datetime 返回UTC格式的日期時間。現在我們已經討論了 $randomInt 和 datetime 變數,讓我們繼續討論剩下的兩個特殊變數。

$processEnv 和 $dotenv

  在開發 API 時,您可能需要存取環境變數或 .env 檔案中定義的變數。要存取環境變數,可以使用 $processEnv。例如,要獲取 USERNAME 環境變數的值,可以使用以下語法 {{$processEnv USERNAME}}。還可以通過使用另一個變數的值作為環境變數的名稱來獲取環境變數的值。請看下面的範例請求。

GET https://httpbin.org/headers
X-1Username: {{$processEnv USERNAME}}
X-2ApiSecret: {{$processEnv API_SECRET}}

###

  對於上面的範例,我建立了一個環境變數 API_SECRET,並將其值設定為「mySecretValueHere」。我還為「USERNAME」建立了一個名為 ValToget 的值。傳送請求時,響應如下所示。

  傳送請求時,從 USERNAME 環境變數填充 X-1Username 的值,X-2ApiSecret 也是如此。如果您使用 $processEnv 試圖存取一個不存在的環境變數,您將在 HTTP 編輯器中得到一個警告。現在讓我們繼續討論 $dotenv。

  當使用 $processEnv 時,您可以獲得在機器/程序上定義的環境變數。在某些情況下,您可能需要獲取 .env 檔案中定義的變數的值。對於這些情況,您可以使用另一個特殊變數 $dotenv。使用 $dotenv 的格式與 $processEnv 相同。我在專案資料夾中建立了一個名為 .env 的檔案,其中包含以下內容。

USERNAME=sayedFromDotenv
API_SECRET=secretFromDotenv

  當使用 $dotenv 時,您應該在 HTTP 編輯器中看到所有定義的變數的補全。請看下面的圖片。

  在上面的影象中,您可以看到我們正在補完我在 .env 檔案中定義的三個變數。下面是一個請求,我們可以用它來嘗試 $dotenv。

GET https://httpbin.org/headers
X-1Username: {{$dotenv USERNAME}}
X-2ApiSecret: {{$dotenv API_SECRET}}

###

  當我們傳送此請求時,結果將如下圖所示。

  如預期的那樣,我們得到了 X-1Username 中的 USERNAME 值和 X-2ApiSecret 中的 API_SECRET 值。當使用 .env 檔案時,請記住,這些檔案通常不被簽入,並且包含使用者特定的值,甚至可能包含 secret。預設情況下,這個檔案可能不會從原始碼管理中排除,所以如果使用這些檔案時要小心,不要簽入任何 secret 值。我們已經介紹了這個版本中的所有更新,因此我們將在參考資料部分之後結束本文。

參考資源

  《Docs for using HTTP files in Visual Studio 2022》連結:https://learn.microsoft.com/zh-cn/aspnet/core/test/http-files?view=aspnetcore-8.0

  《Recent blog post published by Sayed discussing Web API features in Visual Studio 2022》連結:https://devblogs.microsoft.com/visualstudio/web-api-development-in-visual-studio-2022/

  《Safe storage of app secrets in development in ASP.NET Core | Microsoft Learn》連結:https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-7.0&tabs=windows

  《Azure Key Vault Overview – Azure Key Vault | Microsoft Learn》連結:https://learn.microsoft.com/en-us/azure/key-vault/general/overview

小結

  在這篇文章中,我們介紹了 HTTP 編輯器的許多更新,包括對多環境的支援,如何安全地使用 secret 以及我們支援的新語法。正如我在之前的部落格文章中提到的,我們還有很多工作要做,以使 HTTP 檔案的使用者體驗與 Visual Studio Code REST Client extension 不相上下。我們將繼續投資,以改善使用者體驗。從我在上一篇部落格文章中確定的專案來看,當前的優先順序將是增加對從請求中獲取值並將其傳遞給後續請求的支援。這將開啟很多測試場景,並且在 GitHub 中找到的 HTTP 檔案中大量使用。

  我們在這個版本中提供的大多數更新都是受到像您這樣的使用者的反饋的啟發。您可以通過開發者社群與我們分享反饋:通過報告問題報告任何錯誤或問題,並分享您對新功能或改進現有功能的建議。你也可以在這裡留言,或者在推特上@SayedIHashimi 聯絡 Sayed。

 

原文連結:https://devblogs.microsoft.com/visualstudio/safely-use-secrets-in-http-requests-in-visual-studio-2022/