.net core_Cookie授权模式下授权过期后默认跳转http登录地址的解决办法

Posted 深入学习ing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.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访问时陷入无限重定向循环)

 

以上是关于.net core_Cookie授权模式下授权过期后默认跳转http登录地址的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

确定不记名令牌是不是已过期或刚刚被授权

如何在 .net 核心中记录授权尝试

实践剖析.NET Core如何支持Cookie滑动过期和JWT混合认证授权

2021-06-26 .NET高级班 68-ASP.NET Core 授权模式下两次请求问题的解决

winserver 2012“远程桌面授权模式尚未配置”临时解决办法

自定义授权过滤器在 ASP.NET Core 3 中不起作用