.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);
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访问时陷入无限重定向循环)
以上是关于.net core_Cookie授权模式下授权过期后默认跳转http登录地址的解决办法的主要内容,如果未能解决你的问题,请参考以下文章
实践剖析.NET Core如何支持Cookie滑动过期和JWT混合认证授权
2021-06-26 .NET高级班 68-ASP.NET Core 授权模式下两次请求问题的解决