第二十二節: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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM