Razor 会话数据 - HttpContextAccessor 为空

Razor Session Data - HttpContextAccessor is null

我是 MVC5 新手,正在创建一个测试网站来查看 MVC5 和 Razor

用户登录后我有一个非常简单的站点,我需要通过 _Layout 更改菜单,从 "Login" 添加 "Logout" "Account"。

注意:该站点有自己的身份验证,稍后我将查看单点登录。

我真的很难在 MVC5 中管理会话数据,不确定哪种方法最好。我已经尝试过 TEMP DATA ,但是尽管我达到了顶峰,但我发现在用户被重定向到几个页面之后数据丢失了。所以看着好的旧 cookie,但自从 GDPR 以来,我可以看出对开箱即用的 cookie 的默认支持要少得多。

不管怎样,在初创公司我相信我做的都是正确的事情

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                                   options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });   
            services.AddDistributedMemoryCache();  
            services.AddSession(options =>
            {
                // Set session timeout value
                options.IdleTimeout = TimeSpan.FromSeconds(30);
                options.Cookie.HttpOnly = true;
            });
        }


services.AddMvc();
services.AddCaching(); 
services.AddSession();
services.AddHttpContextAccessor();

dependency 将其注入,但是在 Post 中,当我尝试调用 SetString 时,"private readonly IHttpContextAccessor _httpContextAccessor;" 为空

奇怪的是 _Layout 没有抛出相同的空异常

   @using Microsoft.AspNetCore.Http
   @inject IHttpContextAccessor HttpContextAccessor

   @{
        string UserId = HttpContextAccessor.HttpContext.Session.GetString("UserId");
   }

在处理 ASP.Net 之后,处理 Session 的简单方法开始质疑我是否遗漏了什么,因为在 MVC5 中似乎有很多工作要做。那么我应该在 MVC5 中使用不同的方法

设置

options.CheckConsentNeeded = context => false;

这是真的,即

options.CheckConsentNeeded = context => true;

并且您的会话将不再为空。

只想为其他人添加这个,可能不是最干净的代码 在 Sanjay 的帮助下,现在建立了一个粗糙的网站,运行

启动class,示例代码

public class 启动 {

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

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

        services.AddHttpContextAccessor();
        services.AddRazorPages();

        services.AddRazorPages();
        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromSeconds(30);
        });
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseSession();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

}

.csHtml 代码

@using Microsoft.AspNetCore.Http;
@inject IHttpContextAccessor HttpContextAccessor

@{
    if (Context.Session.GetString("UserRole") != null)
    {

.cs 代码

    private readonly IHttpContextAccessor HttpContextAccessor;
    public LoginModel(ISiteUserService siteUserService, 
        IHttpContextAccessor httpContextAccessor)
    {
        this.HttpContextAccessor = httpContextAccessor;        
    }
    public IActionResult OnGet()
    {

        if(HttpContextAccessor.HttpContext.Session.GetString("UserRole")!= null)
        {