• 第二十二节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    Linux设备驱动程序学习(17)-USB 驱动程序(二)
    Linux设备驱动程序学习(11)中断处理
    Linux设备驱动程序学习(8)分配内存
    Linux设备驱动程序学习(12) Linux设备模型(底层原理简介)
    Linux设备驱动程序学习(9)与硬件通信
    Linux设备驱动程序学习(16)-USB 驱动程序(一)
    Linux设备驱动程序学习(7)内核的数据类型
    Linux设备驱动程序学习(4) 高级字符驱动程序操作[(1)ioctl and llseek]
    Linux设备驱动程序学习(14) Linux设备模型(各环节的整合)
    Linux设备驱动程序学习(6) 高级字符驱动程序操作[(3)设备文件的访问控制]
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/12057979.html
Copyright © 2020-2023  润新知