

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 正在配置 AWS Secrets Manager
<a name="configure-asm"></a>

AWS Secrets Manager 帮助您保护访问应用程序、服务和 IT 资源所需的机密。该服务可以安全地存储、管理、加密和轮换数据库凭证、API 密钥和其他机密，包括 OAuth 令牌，并提供与亚马逊关系数据库服务 (Amazon RDS)、Amazon Redshift 和亚马逊 DocumentDB 的原生集成。用户和应用程序通过调用 Secrets Manager 来检索机密 APIs，这样就无需以明文形式对敏感信息进行硬编码。Secrets Manager 包括精细的访问控制权限，并提供了一个集中位置来审核本地和第三方环境中的 AWS 云密钥轮换。

## 在.NET 框架应用程序中使用 Secrets Manager 的先决条件
<a name="configure-asm-prereq"></a>
+ 活跃的 AWS 账户
+ 已安装@@ [微软 Visual Studio](https://visualstudio.microsoft.com/downloads/)
+ AWS Command Line Interface (AWS CLI) 版本 2，已安装并配置为访问您的 AWS 账户 （参见[说明](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)）
+ AWS Toolkit for Visual Studio，已配置（参见[说明](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html)）
+ 使用 Secrets Manager 控制台或 AWS CLI （参见[说明](https://docs.aws.amazon.com/secretsmanager/latest/userguide/managing-secrets.html)）创建和检索的密钥

## 示例
<a name="configure-asm-example"></a>

要在 ASP.NET Core Web API (.NET 6) 中访问 Secrets Manager 中的密钥，请执行以下操作

1. 将以下 NuGet 软件包添加到 ASP.NET Core Web API。

   ```
   AWSSDK.SecretsManager.Caching
   ```

1. 在`Program.cs`文件中，进行以下更改。
   + 添加`Amazon.SecretsManager`命名空间 (1)。

     ```
     using Amazon.SecretsManager;
     ```
   + 注册服务 (2)。

     ```
     builder.Services.AddScoped<IAmazonSecretsManager>(x =>
           new AmazonSecretsManagerClient(RegionEndpoint.EUWest2)
        );
     ```  
![\[对用于访问 Secrets Manager 的 Program.cs 文件所做的更改\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/modernization-net-applications-security/images/asm-program-cs.png)

1. 要从 Secrets Manager 中检索密钥，请对控制器类文件进行以下更改（例如`ValuesController.cs`）。
   + 添加构造函数 (1)。

     ```
     private readonly IAmazonSecretsManager _secretsManager;
     
     public SecretsController(IAmazonSecretsManager secretsManager)
     {
         _secretsManager = secretsManager;
     }
     ```
   + 实现`GetSecret`方法 (2)。

     ```
     string secretName = "arn:aws:secretsmanager:eu-west-2:111122223333:secret:dev/myapp/tenant-gSj6qd";
     GetSecretValueRequest request = new GetSecretValueRequest();
     request.SecretId = secretName;
     request.VersionStage = "AWSCURRENT";
     Task<GetSecretValueResponse> response = _secretsManager.GetSecretValueAsync(request);
     return Ok(new { Secret = response.Result.SecretString });
     ```

     其中 *111122223333* 指的是账户 ID。  
![\[对用于从 Secrets Manager 检索密钥的控制器类文件的更改\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/modernization-net-applications-security/images/asm-controller-class.png)
**注意**  
`secretName`指密钥的名称或 Amazon 资源名称 (ARN)。创建密钥后，可以从 Secrets Manager 控制台中检索此值。您应该`secretName`动态调用或从环境变量调用。不要在生产环境中对这个值进行硬编码。