第二十二节:Asp.Net Core中Https协议的相关配置
一. 基本配置
1. 调试程序如何开启IIS (在vs中)
方法一:创建代码的时候勾选
方法二:手动开启:① 属性→调试→启用SSL ② 在Configure中添加:app.UseHttpsRedirection(); 进行全局拦截。
PS:以上两种方案配置完成后,在vs中访问http请求的地址,会跳转到https的地址。
2. 部分请求需要Https
需求:同时支持Http和Https,部分请求只支持Https.
方案:首先要注释掉 app.UseHttpsRedirection() 全局拦截代码. 然后在需要的方法或者控制器上添加特性[RequireHttps],如下:在Privacy方法上加[RequireHttps]特性,点击对应连接,发现跳转到了 https://localhost/Home/Privacy 这个地址, 没有https的端口,无法显示,这个时候需要找到Https连接的端口,在ConfigureServices中进行跳转端口配置。
services.AddControllersWithViews(options => options.SslPort = 44388);
PS:以上代码配置是针对Core3.0及以上版本的配置。
特别注意:该方案是针对不开启全局拦截的情况适用,如果开启了全局拦截,http请求全部跳转到https请求,https端口用的是默认的,这里的设置无效。
3. 全部请求支持Https的两种配置方式
(1). 中间件
a.默认情况(在VS中):
开启全局拦截app.UseHttpsRedirection(),然后启用SSL(勾选),会自动产生一个Https对应的端口,启动VS,在IISExpress中同时启动了http和https两个请求。请求http连接,会自动跳转到https对应的端口下。
b.代码配置:
在实际生产环境的IIS中,要实现全部http请求跳转https上,除了开启全局拦截UseHttpsRedirection外,还需要进行一下端口配置,需要跳转到IIS发布的端口上。
在ConfigureService方法中通过AddHttpsRedirection配置跳转端口,这里使用307临时重定向(默认307),如果用308,会导致前端链接缓存,后面再改就不好用了(需要手动清理浏览器缓存)
(在生产环境中如果端口不变,可以使用308,开发测试中建议用307)
1 public void ConfigureServices(IServiceCollection services) 2 { 3 4 //这里使用307临时重定向,如果用308,会导致前端链接缓存,后面再改就不好用了(需要手动清理浏览器缓存) 5 services.AddHttpsRedirection(options => 6 { 7 options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect; 8 options.HttpsPort = 44348; 9 }); 10 services.AddControllersWithViews(); 11 }
说明:一个项目挂到IIS,可以同时配置绑定http和https,通过上述代码,即可实现访问http链接,直接跳转到https连接。IIS中绑定如下图:
测试:
情况1. 代码中只配置UseHttpsRedirection全局拦截,不配置任何端口相关的代码。
A. 在IIS中只http部署8001端口,打开地址,主页能打开,且是http请求的,但是点击任何一个页面,都会跳转到https请求,且拼接的地址上没有端口。
B. 在IIS中http部署8001端口,https部署在8002端口,打开http的8001端口,会自动跳转到https的8002端口。 (部署在同一个项目上哦)
结论:只配置UseHttpsRedirection全局拦截,只要在IIS中给该项目同时http和https端口,访问http的时候,会自动跳转到对应https对应的端口下。
情况2: 代码中配置UseHttpsRedirection全局拦截,且利用AddHttpsRedirection进行配置跳转为8009端口。
A. 在IIS中只http部署8001端口,打开地址,主页直接跳转到https对应的8009端口,由于没有配置8009,所以是打不开的。
B. 在IIS中http部署8001端口,https部署在8002端口,打开http的8001端口,会自动跳转到https的8009端口,由于没有配置8009,所以是打不开的。
结论:同时配置UseHttpsRedirection全局拦截 和 AddHttpsRedirection端口跳转,http会直接跳转到配置的端口,与IIS中有没有部署或者部署的哪个端口没有关系,AddHttpsRedirection端口 优先级 大于 IIS中的部署。
综上情况1和情况2所述,要想实现http跳转到https,需要配置UseHttpsRedirection,然后在IIS中配置https端口,AddHttpsRedirection可加可不加,但是加的话必须和IIS中挂的端口一致。
额外补充:改变默认Https跳转端口的方式
a. 环境变量配置:属性→调试→ASPNETCORE_HTTPS_PORT (vs调试无效哦)
b. launchSettings.json:这里直接修改了启动端口了 (vs调试中的IISExpress启动端口直接变了 http和https)
c. UseSetting:webBuilder.UseStartup<Startup>().UseSetting("https_port", "40000"); //高于环境变量的配置 (VS调试中能实现直接跳转到40000端口)
测试:只配置UseHttpsRedirection全局拦截,不要AddHttpsRedirection,通过上面abc三种情况,能否实现对应端口的跳转。
A. 上述配置a,对IIS部署无效哦。
B. 在IIS中只http部署8001端口,代码中launchSettings中修改https端口为8888,打开地址,主页能打开,且是http请求的,但是点击任何一个页面,都会跳转到https请求,且拼接的地址上没有端口,所以说改这个位置是没有用的。
C. 在IIS中只http部署8001端口,代码中是上面c的情况,打开主页会自动跳转到https对应的40000端口,由于IIS没有部署,所以打不开。
(2). 代码重写
也存在前端链接缓存,app.UseRewriter(new RewriteOptions().AddRedirectToHttps(301, 7890)); 表示http请求全部跳转到https下的7890端口
1 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 2 { 3 if (env.IsDevelopment()) 4 { 5 app.UseDeveloperExceptionPage(); 6 } 7 else 8 { 9 app.UseExceptionHandler("/Home/Error"); 10 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 11 app.UseHsts(); 12 } 13 //全局拦截http请求跳转到https 14 //app.UseHttpsRedirection(); 15 16 //通过重写代码的方式进行全局拦截(跳转https到7890端口) 17 app.UseRewriter(new RewriteOptions().AddRedirectToHttps(301, 7890)); 18 app.UseStaticFiles(); 19 app.UseRouting(); 20 app.UseAuthorization(); 21 app.UseEndpoints(endpoints => 22 { 23 endpoints.MapControllerRoute( 24 name: "default", 25 pattern: "{controller=Home}/{action=Index}/{id?}"); 26 }); 27 }
4. 如何更改VS启动端口 Http和https的
找到launchSetting.json文件,iisExpress下的applicationUrl修改http端口;sslPort修改Https端口,即可更改IISExpress启动的时候的端口。这里本质是修改了.vs下的applicationhost.config下的端口号。
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:25348",
"sslPort": 44388
}
},
PS:如果直接去applicationhost.config下找到原先的端口号,并对其进行修改,则IISExpress中启动的端口号则变为修改后的端口号,但是默认打开的浏览器还是 launchSetting.json文件中显示的端口号。
如果再增加几个http(s)端口,可以在此处添加几行,如:
则IISExpress中则多了这两个启动端口。
特别注意:这里添加的时候端口的时候,上面代码不要加到最后一行,加在中间或者最上面都行。
区别于:增加外部访问VS,需要再加一步指令:VS充当IIS的配置步骤(VS2017和VS2019)
本章节结合文章:第二节:SSL证书的申请、配置(IIS通用)及跳转Https请求的两种方式
二. 相关概念
参考:从http→https→hsts
https://www.cnblogs.com/upyun/p/7447977.html
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。