zoukankan      html  css  js  c++  java
  • .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访问时陷入无限重定向循环)

    *感谢您的阅读。喜欢的、有用的就请大哥大嫂们高抬贵手“推荐一下”吧!你的精神 支持是博主强大的写作动力。欢迎转载!
    *博主的文章是自己平时开发总结的经验,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
    *我的博客: http://www.cnblogs.com/lxhbky/
  • 相关阅读:
    54:代码审计-TP5框架审计写法分析及代码追踪
    53:代码审计-TP5框架及无框架变量覆盖反序列化
    52:代码审计-PHP项目类RCE及文件包含下载删除
    51:代码审计-PHP框架MVC类上传断点调试挖掘
    支配树学习笔记
    模拟费用流学习笔记
    python之元类、双下方法( 双下方法也叫魔术方法、 内置方法)
    java 注解
    java 反射
    java synchronized
  • 原文地址:https://www.cnblogs.com/lxhbky/p/14887309.html
Copyright © 2011-2022 走看看