ASP.NET Core会话过期太早

时间:2019-04-23 13:54:41

标签: c# session asp.net-core

我有一个ASP.NET Core Web应用程序,该应用程序使用会话存储一些变量。在任何情况下,本地都可以正常工作,但是由于某些原因,我无法在Azure计算机上的某个时刻从会话中检索值(它们为null)。

场景:

  1. 执行登录,重定向到另一个控制器(在会话中存储用户数据)
  2. 输入一些所需的数据,然后重定向到另一个控制器(还在会话中存储一些内容,并检索其他值)
  3. 在“索引”页面中,为会话设置更多数据。该控制器的视图正在调用一个JavaScript函数,该函数调用此控制器实现的方法“ OnScrollEnd ”。
  4. 当用户向下滚动时,将调用相同的javascript函数(调用 OnScrollEnd
  5. 此方法尝试从会话中检索数据,但现在为空。

(以上方案证明了会话状态基本上是有效的,但在某些时候它无法检索值)

日志:

  

2019-04-23 14:12:34,220 [29]信息   Microsoft.AspNetCore.Authorization.DefaultAuthorizationService   [(null)] <(null)>-授权成功。 2019-04-23   14:12:34,220 [29]信息   Microsoft.AspNetCore.Authorization.DefaultAuthorizationService   [(null)] <(null)>-授权成功。 2019-04-23   14:12:34,220 [29]信息   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [(null)]   <(null)>-执行动作方法   MyWebService.Controllers.AllCardsController.OnScrollEnd(MyWebService)   -验证状态:有效时间2019-04-23 14:12:34,220 [29]信息Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [[null)]   <(null)>-执行动作方法   MyWebService.Controllers.AllCardsController.OnScrollEnd(MyWebService)   -验证状态:有效2019-04-23 14:12:34,220 [29]信息Microsoft.AspNetCore.Session.DistributedSession [(null)] <(null)>-   正在访问过期的会话,密钥:c691acb5-f9ed-5a71-6ebb-f3a0980c4efd   2019-04-23 14:12:34,220 [29]信息   Microsoft.AspNetCore.Session.DistributedSession [(null)] <(null)>-   正在访问过期的会话,密钥:c691acb5-f9ed-5a71-6ebb-f3a0980c4efd   2019-04-23 14:12:34,221 [29]信息   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [(null)]   <(null)>-执行的动作   MyWebService.Controllers.AllCardsController.OnScrollEnd(MyWebService)   在0.7545ms 2019-04-23 14:12:34,221 [29]信息   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [(null)]   <(null)>-执行的动作   MyWebService.Controllers.AllCardsController.OnScrollEnd(MyWebService)   在0.7545ms 2019-04-23 14:12:34,223 [29]错误   Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [[null)]   <(null)>-执行以下操作时发生未处理的异常   请求。

(发生异常是因为从会话中获取的值为空)

启动配置:

        public void ConfigureServices(IServiceCollection services)
        {
            var expiredSessionHours = Configuration.GetValue<int>("SessionExpireHours");
            var expiredSessionMinutes = Configuration.GetValue<int>("SessionExpireMinutes");

            services.AddLocalization(options => options.ResourcesPath = "Resources");

            services.AddAuthentication(options =>
            {
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddCookie(options =>
            {
                options.LoginPath = "/Login";
                options.ExpireTimeSpan = new TimeSpan(expiredSessionHours, expiredSessionMinutes, 0);
                options.SlidingExpiration = true;
                options.Cookie.Expiration = new TimeSpan(expiredSessionHours, expiredSessionMinutes, 0);
            });

            services.AddScoped<IUserAuthentication, AuthenticationService>();
            services.AddTransient<IEncryptionService, EncryptionService>();
            services.AddDbContext<DatabaseContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("myConnectionString"))
                    .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking), 
                ServiceLifetime.Transient);

            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDistributedMemoryCache();
            services.AddSession(options =>
            {
                options.Cookie.HttpOnly = true;
                options.Cookie.IsEssential = true;
                options.IdleTimeout = new TimeSpan(expiredSessionHours, expiredSessionMinutes, 0);
            });

            services.AddMvc(options =>
                {
                    var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
                    options.Filters.Add(new AuthorizeFilter(policy));
                })
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
        {
            if (HostingEnvironment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            var supportedCultures = new[]
            {
                new CultureInfo("en-US"),
            };

            app.UseRequestLocalization(new RequestLocalizationOptions
            {
                DefaultRequestCulture = new RequestCulture("en-US"),
                SupportedCultures = supportedCultures,
                SupportedUICultures = supportedCultures
            });

            loggerFactory.AddLog4Net();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            app.UseSession();
            app.UseAuthentication();
            app.UseMvc();
        }

0 个答案:

没有答案