ASP.NET Core 3.1项目:UI仅支持HTTPS、API仅支持HTTP配置咨询
实现方案与代码示例
要实现UI强制HTTPS、API仅允许HTTP的需求,核心思路是通过Kestrel配置双端口监听,再用自定义中间件区分请求路径并做协议校验,具体步骤如下:
1. 配置Kestrel监听双端口
首先确保Kestrel同时监听HTTP和HTTPS端口,开发环境可保留launchSettings.json的配置,生产环境建议在Program.cs中显式配置:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>() .UseKestrel(options => { // 监听HTTP端口(示例为5000,可根据实际调整) options.ListenAnyIP(5000); // 监听HTTPS端口(示例为5001,生产环境需配置有效证书) options.ListenAnyIP(5001, listenOptions => { // Linux环境可指定PFX证书文件路径及密码 listenOptions.UseHttps("your-cert.pfx", "cert-password"); // 或使用Let's Encrypt等证书颁发机构的证书 }); }); });
2. 添加自定义协议校验中间件
移除默认的UseHttpsRedirection中间件(避免全局重定向覆盖API规则),添加自定义中间件区分UI与API请求:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // 自定义协议校验中间件(需放在路由中间件之前) app.Use(async (context, next) => { var requestPath = context.Request.Path.Value?.Trim().ToLowerInvariant() ?? string.Empty; // 处理API请求:仅允许HTTP if (requestPath.StartsWith("/api")) { if (context.Request.IsHttps) { context.Response.StatusCode = StatusCodes.Status403Forbidden; await context.Response.WriteAsync("API接口仅支持HTTP协议访问"); return; } } // 处理UI请求:强制HTTPS else { if (!context.Request.IsHttps) { var httpsUrl = $"https://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}"; context.Response.Redirect(httpsUrl); return; } } await next(); }); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { // UI路由 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); // API路由 endpoints.MapControllers(); }); }
3. 关键说明
- 路径区分规则:示例中以
/api开头的请求判定为API,可根据实际路由前缀调整; - 生产环境证书:Linux服务器上需配置有效的HTTPS证书,可通过
openssl生成自签证书,或使用Let's Encrypt等免费证书; - 中间件顺序:自定义校验中间件必须放在
UseRouting之前,确保请求进入路由前完成协议校验。
内容的提问来源于stack exchange,提问作者user3901397
相关产品推荐
相关产品推荐

