【问题标题】:How to get "Manage User Secrets" in a .NET Core console-application?如何在 .NET Core 控制台应用程序中获取“管理用户机密”?
【发布时间】:2017-02-16 08:11:35
【问题描述】:

当我创建一个新的 ASP .NET Core Web-应用程序时,我可以在 Visual Studio 中右键单击该项目,我会看到一个名为“管理用户机密”的上下文菜单条目。

当我创建一个新的 .NET Core 控制台-应用程序时,我看不到这个上下文菜单条目。

但是,“Web”应用程序在项目设置中显示为“控制台”应用程序。有什么方法可以在控制台应用程序中获取此上下文菜单条目?

【问题讨论】:

标签: .net-core asp.net-core-1.0 visual-studio-2017


【解决方案1】:

右键单击“管理用户机密”仅在 Web 项目中可用。

控制台应用程序的过程略有不同

它需要手动将所需元素输入到您的 csproj 文件中,然后通过 PMC 添加机密

我在这篇博文中逐步概述了在当前项目中对我有用的过程:

https://medium.com/@granthair5/how-to-add-and-use-user-secrets-to-a-net-core-console-app-a0f169a8713f

tl;博士

第 1 步

右键项目并点击编辑 projectName.csproj

第 2 步

在 TargetFramework 下的 csproj 中添加<UserSecretsId>Insert New Guid Here</UserSecretsId>

在 csproj 的项目组中添加 <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0"/>

第 3 步

打开 PowerShell (admin) cd 进入项目目录并

输入dotnet user-secrets set YourSecretName "YourSecretContent"

这将在以下位置创建一个 secrets.json 文件:

%APPDATA%\microsoft\UserSecrets\<userSecretsId>\secrets.json

其中 userSecretsId = 您为 csproj 创建的新 Guid

第 4 步

打开secrets.json 并编辑使其看起来与此类似

{
 "YourClassName":{
    "Secret1":"Secret1 Content",
    "Secret2":"Secret2 Content"
   }
} 

通过添加您的类的名称,您可以将您的秘密绑定到要使用的对象。

创建一个与您刚刚在 JSON 中使用的名称相同的基本 POCO。

namespace YourNamespace
{
    public class YourClassName
    {
        public string Secret1 { get; set; }
        public string Secret2 { get; set; }
    }
}

第 5 步

Microsoft.Extensions.Configuration.UserSecrets Nuget 包添加到项目中

添加

var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddUserSecrets<YourClassName>()
.AddEnvironmentVariables();

&

var services = new ServiceCollection()
.Configure<YourClassName>(Configuration.GetSection(nameof(YourClassName)))
.AddOptions()
.BuildServiceProvider();

services.GetService<SecretConsumer>();

到您的 Program.cs 文件。

然后将IOptions&lt;YourClassName&gt; 注入到你的类的构造函数中

private readonly YourClassName _secrets;

public SecretConsumer(IOptions<YourClassName> secrets)
{
  _secrets = secrets.Value;
}

然后使用_secrets.Secret1;访问秘密


感谢 Patric 指出 services.GetService&lt;NameOfClass&gt;(); 应该是 services.GetService&lt;SecretConsumer&gt;();

【讨论】:

  • 这也是我们使用的方法,效果很好。它还有一个额外的好处,那就是与 VS 团队最终将进行的(预期的)修复最兼容(假设它与 Web 项目的工作方式相同)。
  • 为了帮助完成这些步骤,我发布了用于 UserSecrets Management 的 Visual Studio 扩展,名为 Open UserSecrets。我希望它对你有帮助。 marketplace.visualstudio.com/…
  • 不应该是“services.GetService();”是“services.GetService();” ?
  • @Patric 感谢您指出这一点,我已经更新了答案
  • 工作正常!两个注意事项: 1. DotNetCliToolReference 需要放在其他包引用所在的 ItemGroups 中。 2. 添加 GUID 和 DotNetCliToolReference 后,重新加载 csproj 文件 - 然后您可以右键单击它并选择“管理用户机密”,这将为您创建 secrets.json 文件。只是一种替代方式,而不是使用控制台(例如,它也可以在测试项目中工作 - 在您按照描述编辑 csproj 文件之后)。最后,一个有用的链接:read user secrets
【解决方案2】:

Manage User Secrets 可从 Visual Studio 2019(在版本 16.1.3 中验证)起的 .NET Core 控制台项目(不仅仅是 ASP.NET Core 项目)的上下文菜单中使用,只要您引用 Microsoft.Extensions.Configuration.UserSecrets NuGet。

【讨论】:

  • 经过测试,对我来说(VS2019 Enterprise v16.2)只有在添加包'Microsoft.Extensions.Configuration.UserSecrets'后才会出现
  • 在 16.4.4 中,该选项似乎对所有项目都可见,并在必要时提示您安装包。感谢您的回答,@Rabadash8820!
  • 有关如何使用 VS Code 用户的命令行实现此目的的文档:docs.microsoft.com/en-us/aspnet/core/security/…
【解决方案3】:

Dotnet Core 3.1 - 我在只需要隐藏密码的情况下找到的最简单方法。
使用项目文件夹中的命令行创建用户密码

dotnet user-secrets init
dotnet user-secrets set mailpassword password1

在 Program.cs 中

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
            
var secretProvider = config.Providers.First();
secretProvider.TryGet("mailpassword", out var secretPass);

//'secretPass' should now contain the password
//if the "mailpassword" secret is not found, then 'secretPass' will be null

如果您在配置方面做更多事情,您可能需要调整 .First()

【讨论】:

【解决方案4】:

1.添加到您的项目文件(仅限 dotnet 2.1 之前):

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

2.设置

 <PropertyGroup>
     <UserSecretsId>a random user id: manually add</UserSecretsId>
 </PropertyGroup>
  1. 在包管理器控制台中移动到迁移项目文件夹并添加一个键:值,例如:

    dotnet user-secrets set "ConnectionStrings:DefaultConnection" "xxxxx"
    

记住要在该项目的目录中(对于包管理器控制台,这意味着 cd'ing 进入项目,而不是解决方案级别)

【讨论】:

  • 附带说明,使用 .NET Core SDK 2.1,第一步将变得多余,因为您会收到警告 Using DotNetCliToolReference to reference 'Microsoft.Extensions.SecretManager.Tools' is obsolete and can be removed from this project. This tool is bundled by default in the .NET Core SDK.
【解决方案5】:
  1. 右键单击项目,然后单击编辑 csproj 文件。
  2. 在第一行将&lt;Project Sdk="Microsoft.NET.Sdk"&gt; 替换为&lt;Project Sdk="Microsoft.NET.Sdk.Web"&gt; 并保存。

现在您可以访问管理用户机密菜单、对其进行编辑和保存。然后,您必须将 csproj 文件的第一行恢复为其默认值,才能再次成为控制台应用程序。

这很愚蠢,但它有效。请记住为每个项目替换 usersecretsid 属性,否则您的所有项目都只有一个 secrets.json

【讨论】:

  • 它看起来确实很愚蠢,而且确实有效 - 是否有意想不到的副作用?
  • 我在使用时没有发现任何相关问题。
【解决方案6】:

他们似乎没有将其添加(至少在 Visual Studio 2015 中)作为控制台或 DLL 应用程序的选项。

您可以将此作为一种解决方法,但风险自负,它会诱使 Visual Studio 相信 dll 项目也具有 Web 功能。

假设 Windows 操作系统

  1. 打开文件资源管理器到C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v{Version Number}\DotNet 注意: 14.0 是 VS 2015,15.0 是 2017 等等

  2. 备份名为Microsoft.DotNet.targets的文件

  3. 将此行添加到另一个ProjectCabability 标记旁边的Microsoft.DotNet.targets

    &lt;ProjectCapability Include="DotNetCoreWeb" /&gt;

  4. 保存文件,然后卸载并重新加载您的项目/重新启动 Visual Studio。

您可能还需要删除 .suo 文件和/或 .vs 文件夹

您现在应该会看到上下文菜单。不幸的是,它也会更改图标。它似乎构建得很好,但这还没有经过认真测试,使用风险自负。

【讨论】:

    【解决方案7】:

    除了此处发布的答案之外,如果您想在项目中获得指向您自己的 secrets.json 文件的链接,您可以将以下代码添加到项目文件中的 ItemGroup:

    <None Include="$(AppData)\microsoft\UserSecrets\$(UserSecretsId)\secrets.json" Link="secrets.json" />
    

    【讨论】:

      【解决方案8】:

      GitHub 上已有一个与此相关的 open 已关闭问题。

      在他们解决之前,您可以使用Visual Studio Code or Command Line: Installing the Secret Manager tool 中描述的命令行方法。这并不意味着您获得了上下文菜单项,但它仍然有效。

      请注意,文档指的是&lt;DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.1" /&gt;,而版本2.0.0已经发布并且可以使用。

      【讨论】:

        【解决方案9】:

        如果只需要获取User Secrets配置,在YourSecretClass的构造函数上就足够了,代码如下:

        public YourSecretClass()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddUserSecrets<Secrets>().Build();
        
            SecretID = builder.GetSection("SecretID").Value;
            SecretPwd = builder.GetSection("SecretPwd").Value;
        }
        

        【讨论】:

          【解决方案10】:

          如何在 .NET Core 控制台应用程序中获取“管理用户机密”?

          将 Visual Studio 2015 社区与更新 3 结合使用

          1. 文件->新建->项目
          2. 选择控制台应用程序 (.NET Core)
          3. 按 CTRL+ALT+L
          4. 单击项目以获取“管理用户机密”,它将打开 一个名为 secrets.json 的文件

          以及您可以在哪里手动输入用户密码。

          我能够使用命令提示符设置用户机密:

          c:\Projects\ConsoleApp2\src\ConsoleApp2>dotnet user-secrets set BrainTree_sandbox:Merchant ID:9rv9mhnb5gh7nnyx

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-29
            • 1970-01-01
            • 2017-08-21
            • 1970-01-01
            • 2021-03-14
            • 1970-01-01
            相关资源
            最近更新 更多