1. Dotnet9首页
  2. .NET
  3. ASP.NET Core

如何在.NET Core Web App中管理用户机密数据管理

22
如何在.NET Core Web App中管理用户机密数据管理
原文来自互联网,由长沙DotNET技术社区编译。

原文链接:https://www.twilio.com/blog/2018/05/user-secrets-in-a-net-core-web-app.html

如何在.NET Core Web App中管理用户机密数据管理

当您将用户敏感数据数据推送到GitHub时,曾经经历过那沉浸“愉快”的时刻吗?我有,我怀疑我不是唯一的一个。

有很多原因导致你不希望你的敏感配置被共享,我说的不仅仅是在GitHub上。开发团队的成员可能不使用相同的测试数据库或连接字符串。也许开发团队只能访问像Twitter这样的应用程序的测试密钥,但是活动密钥却保存在Azure中。

在应用程序中处理敏感数据的一种常见方法是使用环境变量。随着.NET Core的到来,我们现在有了一种以用户敏感数据形式管理配置和敏感数据的整洁方法,可以通过命令行中的Secrets Manager Tool(SMT)对其进行管理。用户密钥存储在项目树之外的用户配置文件目录中的JSON配置文件中,因此不在源代码管理之外。

请参阅此文章以在控制台应用程序中添加“ 用户敏感数据数据”。

我已经在GitHub上[1]创建了一个解决方案, 因此可以随心所欲地跟随完成的项目,也可以使用自己的用户敏感数据数据将其实施到自己的.NET Core API或MVC Web应用程序中。

将用户敏感数据添加到您的项目

在Windows上使用Visual Studio 2017

如果您在Windows上使用Visual Studio并有一个Web项目,则只需单击几下即可添加User Secrets。右键单击该项目,然后选择“ Manage User Secrets

如何在.NET Core Web App中管理用户机密数据管理

单击此将完成几件事;它将secrets.json在Visual Studio中打开文件,您可以在其中添加用户敏感数据并将文件添加 到.csproj文件中。

将SMT添加到.csproj文件中也是一个好主意,这将使您能够从命令行更新用户密钥。

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
  </ItemGroup>

更新:从.NET Core 2.1开始,SMT将包含在dotnet cli中,因此您无需单独添加它。以下是您可能希望添加到用户密钥中的示例。它包括两种写入json对象和简单键/值对的方式。并非所有事情都需要保密,因此不要被带走。我通常会将不需要的任何内容存储在secrets.json文件的公共存储库中。

{
  "TwilioAccountDetails": {
    "AccountSid": ACCOUNT_SID,
    "AuthToken": AUTH_TOKEN
  },


  "SecretStuff:SecretTwo": "In Welsh lore, Fairies rode Corgis into battle",
  "SecretStuff:SecretOne": "The lint that collects in the bottom of your pockets has a name — gnurr",


  "Key": "Value" 
}

SMT将处理您的用户敏感数据数据并将其存储在其中,%APPDATA%\Microsoft\UserSecrets<guid>\secrets.json而您无需真正担心实现。

在Linux,macOS或替代IDE上

如果您未使用Visual Studio 2017或在Linux或macOS中工作, 则无法通过右键单击来使用“Manage User Secret”选项。在这种情况下,您将需要手动添加用户敏感数据。

如前所述,用户密钥存储在项目树之外,在Linux上,而macO存储在中~/.microsoft/usersecrets//secrets.json。

如果该.microsoft文件夹在Linux或macOS上不存在,则需要创建它。请记住,它可能是隐藏的,因此在创建新文件之前进行检查。您可以使用ls -la终端中的命令列出隐藏文件和非隐藏文件。如果确实需要创建一个新.microsoft文件夹,可以通过在终端中运行以下命令来完成:

MKDIR  〜/.microsoft

您将需要创建GUID,并可以这样做使用GUID生成像这样的一个。将标签添加到标签和SMT 的.csproj下面:

<PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <UserSecretsId>USER_SECRETS_GUID</UserSecretsId>
  </PropertyGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
  </ItemGroup>

现在,我们可以从命令行创建和更新用户密钥,这适用于任何OS中的任何项目类型。为此,请导航到项目的根目录,即.csproj文件所在的位置,然后输入以下命令:

dotnet user-secrets set TwilioAccountDetails:AccountSid ACCOUNT_SID

如果您的环境变量中已经存储了一个值,则可以用环境变量ACCOUNT_SID的名称替换,并以开头,$以读取该变量并将其保存到“用户密码”中。例如$TWILIO_ACCOUNT_SID。用户敏感数据数据可以通过其GUID在多个项目之间共享,甚至可以为解决方案的每个分支共享不同的用户敏感数据数据集,从而使维护共享数据变得更加容易。

值得注意的是,用户密钥未加密,仅在开发期间可用。

将用户敏感数据映射到模型

我认为,使用用户敏感数据的最佳方法是将它们映射到模型。这将提供类型安全性,并防止拼写错误的字符串名称引起任何错误。这也使您的代码更具可测试性。

为此,需要执行几个步骤,第一步是将用户敏感数据数据添加到appsettings.json项目根目录中的中。这将需要与您的secrets.json文件紧密关联,仅删除敏感数据。我通常向自己添加一条注释,说明我实际上在哪里设置了敏感数据,如以下示例所示:

{
 "Logging": {
   "IncludeScopes": false,
   "Debug": {
     "LogLevel": {
       "Default": "Warning"
     }
   },
   "Console": {
     "LogLevel": {
       "Default": "Warning"
     }
   }
 },
 "TwilioAccountDetails": {
   "AccountSid": "Set in Azure. For development, set in User Secrets",
   "AuthToken": "Set in Azure. For development, set in User Secrets"
 }
}

接下来,我们需要创建要将用户敏感数据数据映射到的c#模型。为了保持我的解决方案的组织性,我倾向于在我的模型文件夹中添加一个配置文件夹,不管它是在同一个项目中还是在一个被引用的专门的模型项目中。确保

secrets.json *和appsettings.json*与C#模型中的一致。

public class TwilioAccountDetails
{
   public string AccountSid { get; set; }
   public string AuthToken { get; set; }
}

添加配置

我们将需要在Web应用程序的.csproj上安装一些nuget软件包。

<Project Sdk="Microsoft.NET.Sdk.Web">


  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <UserSecretsId>USER_SECRETS_GUID</UserSecretsId>
  </PropertyGroup>


  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>
   <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.4" />
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.2" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="2.0.2" />
    <PackageReference Include="Twilio.AspNet.Core" Version="5.9.7" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
  </ItemGroup>
</Project>

通过在解决方案上单击鼠标右键并选择“还原NuGet包”,或从命令行使用来从Visual Studio中还原nuget包dotnet restore。现在我们有了模型,可以绑定值了。这是在Startup.cs文件中完成的。

namespace WebApp
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }


        public IConfiguration Configuration { get; }


        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {


            // -------------- Configuration ---------------
            services.Configure<TwilioAccountDetails>(Configuration.GetSection("TwilioAccountDetails"));


            services.AddMvc();
        }


        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }


            app.UseMvc();
        }
    }
}

使用映射的用户敏感数据

现在,我们的用户敏感数据已被映射,我们可以使用.NET Core的内置依赖项注入将用户敏感数据注入到类和服务的构造函数中。这是通过IOptions<>界面完成的。有关.NET Core中的依赖注入的更多信息,请参见Microsoft的这篇文章。[2]

public class MessageController : Controller
    {
        private readonly TwilioAccountDetails _twilioAccountDetails;
        // I’ve injected twilioAccountDetails into the constructor


        public MessageController(IOptions<TwilioAccountDetails> twilioAccountDetails)
        {
             // We want to know if twilioAccountDetails is null so we throw an exception if it is           
             _twilioAccountDetails = twilioAccountDetails.Value ?? throw new ArgumentException(nameof(twilioAccountDetails));
        }


        [HttpGet]
        public IActionResult Get()
        {
            return Content($"My Account Sid is {_twilioAccountDetails.AccountSid}");
        }
...

在Azure上覆盖AppSettings

如果要将Web应用程序部署到Azure,则添加用户敏感数据数据相对简单,只需一个步骤。在门户中,选择您的Web应用,然后向下滚动菜单,直到找到application settings。

然后输入您的用户敏感数据(大小写匹配)作为键/值对。

如何在.NET Core Web App中管理用户机密数据管理

摘要

仅此而已!现在,您可以从代码中提取配置和敏感数据。这为您和您的团队提供了更大的灵活性,安全性和可测试性。

请记住,用户密码未加密,只能在开发环境中使用。 

如何在.NET Core Web App中管理用户机密数据管理

如果您想完整地检查代码,请签出GitHub repo[3],在该仓库中可以找到WebApp和Console App。如果您有任何疑问,请在下面发表评论或在@LaylaCodesIt上发给我。

References

[1] GitHub上: https://github.com/Layla-P/UserSecretsWeb
[2] 文章。: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.0
[3] GitHub repo: https://github.com/Layla-P/UserSecretsWeb

原文出处:微信公众号【LAYLA PORTER DotNET技术圈】

原文链接:https://mp.weixin.qq.com/s/dpW2dCZ6sf6kdAeoN3ekGQ

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论