【发布时间】:2018-03-02 08:35:47
【问题描述】:
TL;DR 现在使用 ASP.NET Core 2.0 设置 HTTPS 的正确方法是什么?
我想将我的项目配置为使用 https 和他们在BUILD 2017 中显示的证书。我尝试了几种设置,但没有任何效果。经过一番研究,我更加困惑。看来配置url和port的方法有很多……我见过appsettings.json,hosting.json,通过代码,在launchsettings.json中我们也可以设置url和port。
有没有“标准”的方式来做到这一点?
这是我的appsettings.development.json
{
"Kestrel": {
"Endpoints": {
"Localhost": {
"Address": "127.0.0.1",
"Port": "40000"
},
"LocalhostWithHttps": {
"Address": "127.0.0.1",
"Port": "40001",
"Certificate": {
"HTTPS": {
"Source": "Store",
"StoreLocation": "LocalMachine",
"StoreName": "My",
"Subject": "CN=localhost",
"AllowInvalid": true
}
}
}
}
}
}
但是当我从命令行使用dotnet run 启动或从Visual Studio 启动调试器时,它总是从launchsettings.json 获取url 和端口。
这是我的Program.cs 和Startup.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
public class Startup
{
public IConfiguration Configuration { get; }
public string Authority { get; set; } = "Authority";
public string ClientId { get; set; } = "ClientId";
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MvcOptions>(options => options.Filters.Add(new RequireHttpsAttribute()));
JsonConvert.DefaultSettings = () => new JsonSerializerSettings() {
NullValueHandling = NullValueHandling.Ignore
};
services.AddSingleton<IRepository, AzureSqlRepository>(x => new AzureSqlRepository(Configuration.GetConnectionString("DefaultConnection")));
services.AddSingleton<ISearchSplitService, SearchSplitService>();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => new JwtBearerOptions {
Authority = this.Authority,
Audience = this.ClientId
});
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions() { HotModuleReplacement = true, ReactHotModuleReplacement = true, HotModuleReplacementEndpoint = "/dist/__webpack_hmr" });
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes => {
routes.MapRoute(
name: "default",
template: "{controller=Home}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
}
}
正如我所说,我无法让它在任何情况下工作。今天使用 ASP.NET Core 2.0 设置 HTTPS 的正确方法是什么?
【问题讨论】:
-
在生产中,最好使用 Nginx 作为前端,使用 nginx 配置 SSL/TLS 很简单,你可以保持 kestrel 服务于 http。众所周知的做法是为后端进行 ssl-offloading,以避免不必要的复杂性和性能降低,而不会影响安全。 MS Azure 应用了类似的架构概念。
标签: c# asp.net-core asp.net-core-2.0 kestrel-http-server