Как получить доступ к секретам в ASP.NET Core Program.cs

Я создаю приложение ASP.NET Core версии 1.1, в котором Kestrel должен работать по протоколу HTTPS / SSL. Здесь Program.cs загрузочный код...

public class Program
{
    public static void Main(string[] args)
    {
        var contentRoot = Directory.GetCurrentDirectory();
        var certFilePath = Path.Combine(contentRoot, @"Certificates\Kestrel.pfx");

        // TODO Store password in Secrets
        var certificate = new X509Certificate2(certFilePath, "kr0GEE6lJ5Ok");

        var host = new WebHostBuilder()
            .UseKestrel(cfg => cfg.UseHttps(certificate))
            .UseContentRoot(contentRoot)
            .UseSetting("detailedErrors", "true")
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseUrls("https://localhost:5001/")
            .CaptureStartupErrors(true)
            .Build();

        host.Run();
    }
}

Это работает, как вы могли ожидать, но я хотел бы удалить строку пароля сертификата из кода.

Я использовал новый (для меня в любом случае) инструмент Secrets Manager Tool в остальной части приложения, но не могу найти способ ссылаться на это на данном этапе в конвейере приложения.

Это возможно? Если нет, на какие еще варианты я могу посмотреть?

Благодарю.

1 ответ

Решение

Я не уверен, что вы можете использовать Secrets API. Но вы можете прочитать пароль либо из переменных окружения, либо из файла appsettings.json. Вот пример кода. Я использую код.NET Core 2.0, который похож на.NET Core 1.1.

public class Program
{
    public static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddEnvironmentVariables()
            .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
        BuildWebHost(args).Run();
    }
    public static IConfigurationRoot Configuration { get; set; }
    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args).UseKestrel(options =>
        {
            var password = Configuration["certPassword"];
            options.Listen(System.Net.IPAddress.Loopback, 5001, listenOptions =>
            {
                listenOptions.UseHttps("testCert.pfx", password);
                listenOptions.UseConnectionLogging();
            });
        })
        .UseStartup<Startup>()
        .Build();
}

Надеюсь, поможет.

Это быстрое решение, основанное на следующей статье, в которой объясняется, как добавить секрет пользователя в консольное приложение.

// secrets.json (you can access to this file in Visual Studio via right click on your project in Solution Explorer => Manage user secrets)
{
    "SecretSection": {
        "Secret1": "Value1",
        "Secret2": "Value2"
    }
}

// YourSecretSettings.cs
public class YourSecretSettings
{
    public string Secret1 { get; set; }
    public string Secret2 { get; set; }
}


// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddEnvironmentVariables()
            .AddJsonFile("appsettings.json", optional: false)
            .AddUserSecrets<YourSecretSettings>()
            .Build();

        var secretSettings = config.GetSection("SecretSection").Get<YourSecretSettings>();
        // Do Something with your secret settings ...

        CreateWebHostBuilder(args)
            .Build()
            .Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

И вуаля:)

Другие вопросы по тегам