.net core_Cookie授權模式下授權過期后默認跳轉http登錄地址的解決辦法


  這里先羅列一下.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);
View Code

 

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
}
View Code

 

  問題:上面時常規的配置,配置好之后發布到仿真環境(仿真環境為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訪問時陷入無限重定向循環)

 


免責聲明!

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



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