【译】在 Visual Studio 2022 中安全地在 HTTP 请求中使用机密

发布时间 2023-09-11 07:45:19作者: MeteorSeed

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