第二十二节: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         }
View Code

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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2019-12-18 08:38  Yaopengfei  阅读(4149)  评论(3编辑  收藏  举报