How to get “Manage User Secrets” in a .NET Core 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>();

Leave a Comment