How to get "Manage User Secrets" in a .NET Core console-application?

When I create a new ASP .NET Core Web-Application, I can right-click the project in Visual Studio, and I see a context-menu entry called "Manage User Secrets".

When I create a new .NET Core Console-Application, I don't see this context-menu entry.

However, a "Web"-Application shows as "console" application in the project settings. Is there any way I can get this context-menu entry in a console-application ?


"Manage user secrets" from a right click is only available in web projects.

There is a slightly different process for console applications

It requires manually typing the required elements into your csproj file then adding secrets through the PMC

I have outlined the process that worked for me in my current project step by step in this blog post :

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

tl;dr

Step 1

Right click project and hit edit projectName.csproj

Step 2

add <UserSecretsId>Insert New Guid Here</UserSecretsId> into csproj under TargetFramework

add <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0"/> within Item Group in csproj

Step 3

Open PowerShell (admin) cd into project directory and

enter dotnet user-secrets set YourSecretName "YourSecretContent"

This will create a secrets.json file in:

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

Where userSecretsId = the new Guid you created for your csproj

Step 4

Open secrets.json and edit to look similar to this

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

By adding the name of your class you can then bind your secrets to an object to be used.

Create a basic POCO with the same name that you just used in your JSON.

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

Step 5

Add Microsoft.Extensions.Configuration.UserSecrets Nuget package to project

Add

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>();

To your Program.cs file.

Then inject IOptions<YourClassName> into the constructor of your class

private readonly YourClassName _secrets;

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

Then access secrets by using _secrets.Secret1;


Thanks to Patric for pointing out that services.GetService<NameOfClass>(); should be services.GetService<SecretConsumer>();


Manage User Secrets is available from the context menu of .NET Core Console projects (not just ASP.NET Core projects) since Visual Studio 2019 (verified in version 16.1.3), once you reference the Microsoft.Extensions.Configuration.UserSecrets NuGet.