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

  在 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/

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章