web-dev-qa-db-fra.com

HttpContext.Session ne maintient pas l'état

J'ai été partout sur le net pour découvrir ce qui ne va pas avec mon utilisation de HttpContext.Session. Il semble que la session soit définie lorsque je l'ai définie, mais une fois qu'elle a quitté la fonction, je ne peux plus y accéder. J'ai examiné mon fichier Startup.cs pour m'assurer que tout est correctement ajouté et j'ai installé les packages NuGet appropriés.

Dans ma classe de contrôleur où j'utilise réellement les sessions, j'ai le code suivant:

    /// <summary>
    /// Check to see if user exists.  If yes, go to the administrator interface,
    /// else return to the login page.
    /// </summary>
    /// <param name="administrator"></param>
    /// <returns></returns>
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult AdminLogin([Bind("UserName", "Password")] Administrator administrator)
    {
        try
        {
            var admin = _context.Administrators.Where(x => x.UserName == administrator.UserName
                && x.Password == administrator.Password).FirstOrDefault();

            if (admin != null)
            {
                HttpContext.Session.SetString("IsAdmin", "true");
                _httpContextAccessor.HttpContext.Response.Cookies.Append("IsAdmin", "true");
            }

            return RedirectToAction("Index");
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// Shows the administrator interface
    /// </summary>
    public IActionResult Index()
    {
        if (HttpContext.Session.GetString("IsAdmin") == "true"
            || _httpContextAccessor.HttpContext.Request.Cookies["IsAdmin"] == "true")
        {
            ViewData["isAdmin"] = "true";
            HttpContext.Session.SetString("IsAdmin", "true");
            ViewData["Title"] = "Administrator Page";
            ViewData["Message"] = "Administrator Page";
            return View();
        }
        else
        {
            return RedirectToAction("AdminLogin");
        }
    }

Comme vous pouvez le voir, je configure une variable de session (IsAdmin) dans la fonction AdminLogin, puis j'essaie d'accéder à cette session dans la vue Index. J'ai ValidateAntiForgeryToken, ce qui pourrait être mon problème, mais même si je le supprime, mes sessions ne sont pas persistantes. J'essaie également d'utiliser des cookies comme solution de contournement, mais ceux-ci ne persistent pas non plus. Je peux poster plus de code si quelqu'un veut m'aider. Si je n'arrive pas à faire fonctionner cela, je devrai recommencer et ne pas utiliser Asp.NET Core. Le reste de mon application devra éventuellement utiliser des sessions également.

Voici mon startup.cs, juste pour m'assurer qu'il est bien installé correctement ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OM2018a.Data;
using Microsoft.EntityFrameworkCore;

namespace OM2018a
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDbContext<OM2018Context>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            // Add MVC services to the services container.
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddDistributedMemoryCache(); // Adds a default in-memory implementation of IDistributedCache
            services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromMinutes(15);
            });

            services.AddHttpContextAccessor();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();

            // IMPORTANT: This session call MUST go before UseMvc()
            app.UseSession();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}
6
C Ruckman

J'ai trouvé la réponse! La valeur de la variable de session devient toujours nulle dans ASP.NET Core 2.1

J'ai dû changer les options.CheckConsentNeeded = context => true; à faux et cela a fonctionné!

7
C Ruckman

Vous devez changer dans le fichier Startup.cs options.CheckConsentNeeded = context => true; à options.CheckConsentNeeded = context => false;

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
.....
}

C'est ça.

1
sanji