页面上的Cookie身份验证问题请求ASP.NET Core和身份

时间:2019-07-30 09:53:05

标签: c# asp.net asp.net-core asp.net-identity session-cookies

在我的Web应用程序中使用ASP.NET Identity,我强制新用户在注册后启用2fa。 问题:第一次用户向2fa注册(扫描QR码并输入代码),并抛出404。 第二次或之后的任意多次,对服务器的请求是正常的,它们被重定向到网站。

在深入研究了中间件和http请求之后,我意识到第一个请求的cookie必不可少的有效期限为01/01/1970 ,但是在同一页面上第一个请求之后的所有请求有不同的Cookie(可以接受)。我绝对不知道为什么会这样,我的Cookie已在StartUp.cs中注册,而在其他任何地方都没有这个问题。

提琴手分析

我想补充一点,在发送请求之前,Cookie看起来像第二个请求,但是它们以某种方式重置为您可以在下面看到的内容,从而导致请求失败。

404错误请求,URL ===> / Identity / Account / Prompt2FA(首次请求enter image description here

找到了302,URL ===> / Identity / Account / Prompt2FA(第二次请求enter image description here

对此非常感谢,如果您需要任何代码来帮助解决此问题,请告诉我。我想避免有一个很长的问题。谢谢!

StartUp.cs

  public class Startup
    {
        public IConfiguration Configuration { get; }
        public IContainer ApplicationContainer { get; private set; }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddIdentity<ApplicationUser, IdentityRole>().AddDefaultTokenProviders().AddEntityFrameworkStores<ApplicationDbContext>();
            services.ConfigureApplicationCookie(options =>
            {
                options.SlidingExpiration = true;
                options.ReturnUrlParameter = "/Account/Login";
                options.ExpireTimeSpan = TimeSpan.FromHours(2);
                options.Cookie.Expiration = TimeSpan.FromHours(2);
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddAntiforgery(option =>
            {
                option.HeaderName = "XSRF-TOKEN";
                option.SuppressXFrameOptionsHeader = false;
            });

            var containerBuilder = new ContainerBuilder();
            containerBuilder.Populate(services);
            this.ApplicationContainer = containerBuilder.Build();
            var serviceProvider = new AutofacServiceProvider(this.ApplicationContainer);
            return serviceProvider;
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.ConfigureCustomExceptionMiddleware();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvc();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

所以我意识到在StartUp.cs中我设置了

    services.Configure<SecurityStampValidatorOptions>(options =>
    {
        // enables immediate logout, after updating the user's stat, default is 30minutes.
        options.ValidationInterval = TimeSpan.Zero;
    });

这样做的目的是当管理员更改用户信息时(我建立了基本的Admin CMS)。由于会话无效,他们将被迫再次登录。

我的问题中提到的问题出现在用户验证其两因素身份验证时,因为它更改了数据库表中的字段,然后使用户会话无效