如何重新生成会话ID ASP.NET Core 2.2

时间:2019-06-04 19:17:42

标签: c# session asp.net-web-api asp.net-core-2.0 csrf

我正在构建示例单页应用程序。为此,我按照Microsoft的教程构建了Web API。我成功实现了会话和csrf令牌。但是,我已经使用其他框架多次构建了后端(这是因为该项目将展示我使用不同语言的各种框架的工作)并保持一致性,在其他框架中,我必须在登录之前实现会话,并且csrf机密存储在会话中。因此,在登录时,将通过ajax标头验证csrf令牌,更改该令牌,并为登录的用户创建一个新会话。注销时也会发生同样的情况。 Laravel和Django是此实现的示例。在ASP.NET Core中,我无法找到一种方法来执行此操作,因为在关闭浏览器之前会话始终是相同的,因此当我与邮递员进行测试时,我永远都无法重新生成ID,更不用说了创建一个新会话。 CSRF的秘密在于它自己的防伪cookie,而不是与会话绑定。无论如何,我可以在ASP.NET Core中实现它吗?

这里是为了以防万一,但是我怀疑您会需要它:

Startup.cs

public void ConfigureServices(IServiceCollection services)
    services.AddAntiforgery(options => {
        // Set Cookie properties using CookieBuilder properties
        options.HeaderName = "X-XSRF-TOKEN";
        options.SuppressXFrameOptionsHeader = true;
    });

    services.AddMvc()
        .AddMvcOptions(options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));

    // other services ommitted
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IAntiforgery antiforgery) {
    app.Use(next => context => { // set up csrf middleware
        var tokens = antiforgery.GetAndStoreTokens(context);
        context.Response.Cookies.Append(
            Environment.GetEnvironmentVariable("XSRF_COOKIE"), 
            tokens.RequestToken, 
            new CookieOptions() { 
                MaxAge = TimeSpan.FromMinutes(sessionLifetime),
                HttpOnly = false ,
                Secure = Environment.GetEnvironmentVariable("APP_ENV") != "local"
            });
        return next(context);
    });
}

0 个答案:

没有答案