Asp.net core 如何在ASP.NET Core Program.cs中访问机密

Asp.net core 如何在ASP.NET Core Program.cs中访问机密,asp.net-core,kestrel-http-server,Asp.net Core,Kestrel Http Server,我正在构建一个ASP.NET核心版本1.1应用程序,我希望Kestrel能够通过HTTPS/SSL运行。下面是Program.csbootstrap代码 public class Program { public static void Main(string[] args) { var contentRoot = Directory.GetCurrentDirectory(); var certFilePath = Path.Combine(co

我正在构建一个ASP.NET核心版本1.1应用程序,我希望Kestrel能够通过HTTPS/SSL运行。下面是
Program.cs
bootstrap代码

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();
    }
}
公共类程序
{
公共静态void Main(字符串[]args)
{
var contentRoot=Directory.GetCurrentDirectory();
var certFilePath=Path.Combine(contentRoot,@“Certificates\Kestrel.pfx”);
//TODO在机密中存储密码
var证书=新的X509Certificate2(certFilePath,“kr0GEE6lJ5Ok”);
var host=new WebHostBuilder()
.UseKestrel(cfg=>cfg.UseHttps(证书))
.UseContentRoot(contentRoot)
.UseSetting(“详细错误”、“真”)
.Useii整合()
.UseStartup()
.useURL(“https://localhost:5001/")
.CaptureStartupErrors(真)
.Build();
host.Run();
}
}
这正如您所期望的那样工作,但是我想从代码中删除证书的密码字符串

我在应用程序的其余部分使用了新的(无论如何对我来说),但在应用程序管道的这个阶段,我找不到一种方法来引用它

这可能吗?如果没有,我可以考虑哪些其他选择


谢谢。

我不确定您是否可以使用Secrets API。但您可以从环境变量或appsettings.json文件中读取密码。下面是示例代码。我使用的是.NETCore2.0代码,它类似于.NETCore1.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();
}
公共类程序
{
公共静态void Main(字符串[]args)
{
var builder=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddenEnvironmentVariables()
.AddJsonFile(“appsettings.json”);
Configuration=builder.Build();
BuildWebHost(args.Run();
}
公共静态IConfigurationRoot配置{get;set;}
公共静态IWebHost BuildWebHost(字符串[]args)=>
WebHost.CreateDefaultBuilder(args).UseKestrel(选项=>
{
var password=配置[“certPassword”];
options.Listen(System.Net.IPAddress.Loopback,5001,listenOptions=>
{
UseHttps(“testCert.pfx”,密码);
UseConnectionLogging();
});
})
.UseStartup()
.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>();
}
//secrets.json(您可以在Visual Studio中通过右键单击解决方案资源管理器中的项目=>管理用户机密来访问此文件)
{
“秘密部门”:{
“秘密1”:“价值1”,
“Secret2”:“Value2”
}
}
//YourSecretSettings.cs
公共类安全设置
{
公共字符串Secret1{get;set;}
公共字符串Secret2{get;set;}
}
//Program.cs
公共课程
{
公共静态void Main(字符串[]args)
{
var config=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddenEnvironmentVariables()
.AddJsonFile(“appsettings.json”,可选:false)
.AddUserSecrets()
.Build();
var secretSettings=config.GetSection(“SecretSection”).Get();
//用你的秘密设置做点什么。。。
CreateWebHostBuilder(args)
.Build()
.Run();
}
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup();
}

看哪:)

这当然是一个解决办法——谢谢。目前,对.Net核心的整个设置加密支持似乎有点薄弱,或者至少有点偏向Azure。