這里先羅列一下.net core下Cookie認證模式的寫法:
1-ConfigureServices配置授權規則:

//修改Cookie驗證里面的默認設置 Action<CookieAuthenticationOptions> cookieAuthenticationOptionsAction = o => { o.LoginPath = this.Configuration["COOKIE_LOGIN_URL"]; //登錄路徑:這是當用戶試圖訪問資源但未經過身份驗證時,程序將會將請求重定向到這個相對路徑。 o.LogoutPath = this.Configuration["COOKIE_LOGOUT_URL"]; o.AccessDeniedPath = this.Configuration["COOKIE_DENIED_URL"]; o.ReturnUrlParameter = this.Configuration["COOKIE_RETURN_URLPARAMETER"] ?? "returnUrl"; double timeOut = Helper.TypeParseHelper.StrToDouble(this.Configuration["COOKIE_TIMEOUT"] ?? "2880"); o.ExpireTimeSpan = System.TimeSpan.FromSeconds(timeOut); o.Cookie.HttpOnly = true; o.Cookie.Name = this.Configuration["COOKIE_NAME"]; //o.Cookie.Domain = this.Configuration["COOKIE_DOMAIN"]; o.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Lax; //寬松模式, o.Cookie.Path = "/"; o.Cookie.IsEssential = Convert.ToBoolean(this.Configuration["COOKIE_ISESSENTIAL"] ?? "true"); //是否強制存儲cookie,注意,也就是當用戶不同意使用cookie的時候,你也可以通過設置這個屬性為true把cookie強制存儲. o.SlidingExpiration = true; //Cookie可以分為永久性的和臨時性的。 臨時性的是指只在當前瀏覽器進程里有效,瀏覽器一旦關閉就失效(被瀏覽器刪除)。 永久性的是指Cookie指定了一個過期時間,在這個時間到達之前,此cookie一直有效(瀏覽器一直記錄着此cookie的存在)。 slidingExpriation的作用是,指示瀏覽器把cookie作為永久性cookie存儲,但是會自動更改過期時間,以使用戶不會在登錄后並一直活動,但是一段時間后卻自動注銷。也就是說,你10點登錄了,服務器端設置的TimeOut為30分鍾,如果slidingExpriation為false,那么10:30以后,你就必須重新登錄。如果為true的話,你10:16分時打開了一個新頁面,服務器就會通知瀏覽器,把過期時間修改為10:46。 更詳細的說明還是參考MSDN的文檔。 o.Events = new CookieAuthenticationEvents { OnSignedIn = context => { this.Logger?.LogTrace("{0} - {1}: {2}", DateTime.UtcNow, "OnSignedIn", context.Principal.Identity.Name); return Task.CompletedTask; }, OnSigningOut = context => { this.Logger?.LogTrace("{0} - {1}: {2}", DateTime.UtcNow, "OnSigningOut", context.HttpContext.User.Identity.Name); return Task.CompletedTask; }, OnValidatePrincipal = context => { this.Logger?.LogTrace("{0} - {1}: {2}", DateTime.UtcNow, "OnValidatePrincipal", context.Principal.Identity.Name); return Task.CompletedTask; }, }; }; #endregion //默認登錄Cookie驗證方式 services.AddDefaultAuthenticationWithProtectedCookie(cookieAuthenticationOptionsAction);
2-授權配置文件:

{ "COOKIE_NAME": "meshopcrm", "COOKIE_DOMAIN": "meshop.cn", "COOKIE_TIMEOUT": "900", "COOKIE_LOGIN_URL": "/Auth/Login", "COOKIE_LOGOUT_URL": "/Auth/Logout", "COOKIE_DENIED_URL": "/Auth/Forbidden", "COOKIE_RETURN_URLPARAMETER": "returnUrl", "COOKIE_ISESSENTIAL": true }
問題:上面時常規的配置,配置好之后發布到仿真環境(仿真環境為https有證書的安全鏈接,所有請求均走https),手動移除Cookie授權信息后,點擊頁面菜單,報以下錯誤:
Mixed Content: The page at 'https://xxx/Home/Index' was loaded over HTTPS, but requested an insecure frame 'http://xxx/Auth/Login?returnUrl=%2FShop%2FShopInfo%2FShopInfoList'. This request has been blocked; the content must be served over HTTPS.
奇怪的時,頁面沒有一處地方使用http,為啥還會跳轉到http里面去呢,更奇怪的是,我刷新頁面好使,能自動跳轉到https下的登錄頁,“奇怪里面必有妖”,去百度搜一搜吧,一定有其他小伙伴們遇到過類似的問題,其實解決方案也很簡單,就是強制讓跳轉http的登錄地址改為https的登錄地址,有兩種方式:
1-在頁面里面加安全協議策略:<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />
2-從老外的網站上找了另一個答案,采用中間件,設置所有請求頭走https:
//app.UseHttpsRedirection();這種方式同樣無法控制未授權時跳轉登陸時使用https //當前設置主要為了解決: //授權失敗時跳轉登錄頁面時使用https,要不然仿真環境在授權過期后在不刷新頁面的情況JS報錯:Mixed Content: The page at 'https://store.runshopstore.com/Home/Index' was loaded over HTTPS, but requested an insecure frame 'http://store.runshopstore.com/Auth/Login?returnUrl=%2FShop%2FShopInfo%2FShopInfoList'. This request has been blocked; the content must be served over HTTPS. if (!CONST.DEFAULT_DOMAIN.Contains("localhost") && !CONST.DEFAULT_DOMAIN.Contains("meshop.net")) { app.Use((context, next) => { context.Request.Scheme = "https"; return next(); }); }
這里要注意:app.UseHttpsRedirection(); 這個同樣也可以控制https跳轉,但是是無法解決本問題的,但是可以解決刷新頁面自動跳轉到https的問題,哈哈,有點奇怪吧。
最后附上道友的文檔鏈接:
第一篇搜到的:挖坑指南:網站http請求全變https?
.net界大師的文章:Content Security Policy 入門教程
老外的解決方案:嘗試通過https訪問時,.net core 2.0 cookie身份驗證入口無限循環循環(.net core 2.0 cookie身份驗證在嘗試通過https訪問時陷入無限重定向循環)