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