一. 基本配置

1. 调试程序如何开启IIS (在vs中)

方法一:创建代码的时候勾选

第二十二节:Asp.Net Core中Https协议的相关配置

方法二:手动开启:① 属性→调试→启用SSL ② 在Configure中添加:app.UseHttpsRedirection(); 进行全局拦截。

第二十二节:Asp.Net Core中Https协议的相关配置

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对应的端口下。

第二十二节:Asp.Net Core中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中绑定如下图:

第二十二节:Asp.Net Core中Https协议的相关配置

 

测试:

情况1. 代码中只配置UseHttpsRedirection全局拦截,不配置任何端口相关的代码。

 A. 在IIS中只http部署8001端口,打开地址,主页能打开,且是http请求的,但是点击任何一个页面,都会跳转到https请求,且拼接的地址上没有端口。

 B. 在IIS中http部署8001端口,https部署在8002端口,打开http的8001端口,会自动跳转到https的8002端口。 (部署在同一个项目上哦)

结论:只配置UseHttpsRedirection全局拦截,只要在IIS中给该项目同时http和https端口,访问http的时候,会自动跳转到对应https对应的端口下。

第二十二节:Asp.Net Core中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

相关文章:

  • 2021-09-04
  • 2021-08-26
  • 2021-09-06
  • 2021-12-13
  • 2022-03-02
  • 2021-07-02
  • 2021-06-08
  • 2021-06-24
猜你喜欢
  • 2021-12-17
  • 2022-01-11
  • 2021-04-12
  • 2021-06-03
  • 2022-12-23
  • 2022-12-23
  • 2021-09-02
相关资源
相似解决方案