net control cache asp c# azure redis asp.net-core asp.net-identity-3

control - cache c# net core



Guarde la sesiĆ³n del usuario en Redis con ASP.NET Core en Azure (1)

Estoy usando redis cache para guardar algunas cosas en mi proyecto.

Estoy usando Azure (WebApp), y cuando hago un SWAP entre mi entorno de preproducción y producción, la sesión del usuario se pierde y necesita volver a iniciar sesión en mi página web.

Estoy usando Identity 3.0, con UseCookieAuthentication. Me gustaría almacenar la "sesión" en Redis para resolver mi problema cuando realizo el intercambio.

No encuentro información al respecto, ¿alguna idea? Gracias

Startup.cs Code ConfigureServices:

public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); // Registers MongoDB conventions for ignoring default and blank fields // NOTE: if you have registered default conventions elsewhere, probably don''t need to do this //RegisterClassMap<ApplicationUser, IdentityRole, ObjectId>.Init(); AutoMapperWebConfiguration.Configure(); services.AddSingleton<ApplicationDbContext>(); // Add Mongo Identity services to the services container. services.AddIdentity<ApplicationUser, IdentityRole>(o => { // configure identity options o.Password.RequireDigit = false; o.Password.RequireLowercase = false; o.Password.RequireUppercase = false; o.Password.RequireNonLetterOrDigit = false; o.Password.RequiredLength = 6; o.User.RequireUniqueEmail = true; o.Cookies.ApplicationCookie.CookieSecure = CookieSecureOption.SameAsRequest; o.Cookies.ApplicationCookie.CookieName = "MyCookie"; }) .AddMongoStores<ApplicationDbContext, ApplicationUser, IdentityRole>() .AddDefaultTokenProviders(); services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(60); options.CookieName = "MyCookie"; }); services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); services.AddLocalization(options => options.ResourcesPath = "Resources"); // Caching This will add the Redis implementation of IDistributedCache services.AddRedisCache(); services.Configure<RedisCacheOptions>(options => { options.Configuration = Configuration["RedisConnection"]; }); services.AddCaching(); // Add MVC services to the services container. services.AddMvc(options => { options.CacheProfiles.Add("OneDay", new CacheProfile() { Duration = 86400, Location = ResponseCacheLocation.Any }); options.CacheProfiles.Add("OneMinute", new CacheProfile() { Duration = 60, Location = ResponseCacheLocation.Any }); }) .AddViewLocalization(options => options.ResourcesPath = "Resources") .AddDataAnnotationsLocalization(); services.Configure<AppOptions>(Configuration.GetSection("AppOptions")); }

Código Startup.cs

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { // loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); app.UseApplicationInsightsRequestTelemetry(); if (env.IsDevelopment()) { app.UseBrowserLink(); app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseSession(); app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear()); app.UseApplicationInsightsExceptionTelemetry(); app.UseStaticFiles(); app.UseIdentity(); app.UseCookieAuthentication(options => { options.AutomaticAuthenticate = true; options.LoginPath = new PathString("/Account/Login"); options.AutomaticChallenge = true; }); var requestLocalizationOptions = new RequestLocalizationOptions { // Set options here to change middleware behavior SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("es-ES") }, SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("es-ES") }, RequestCultureProviders = new List<IRequestCultureProvider> { new CookieRequestCultureProvider { CookieName = "_cultureLocalization" }, new QueryStringRequestCultureProvider(), new AcceptLanguageHeaderRequestCultureProvider { } } }; app.UseRequestLocalization(requestLocalizationOptions, defaultRequestCulture: new RequestCulture("en-US")); app.UseFacebookAuthentication(options => { options.AppId = "*****"; options.AppSecret = "****"; }); app.UseGoogleAuthentication(options => { options.ClientId = "*****"; options.ClientSecret = "***"; }); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); routes.MapRoute( name: "view", template: "{customName}/{id}", defaults: new { controller = "View", action = "Index" }); }); }


La sesión no está vinculada a Autenticación, está intentando resolverla de forma incorrecta.

Todos los formularios de autenticación de tickets y cookies están encriptados y firmados utilizando la capa de protección de datos. El problema al que se enfrenta es debido a que las claves de cifrado no se guardan y las aplicaciones están aisladas entre sí.

Para resolverlo, debe compartir las claves de cifrado y establecer un nombre de aplicación en su código. Sinceramente, te recomiendo que no lo hagas. La preproducción no es un servicio en vivo, y no debería poder autenticarse a ambos a la vez.

Si cree que debe hacerlo, debe compartir el anillo de claves de cifrado y establecer un nombre de aplicación fijo. Puede compartir claves a través de una carpeta compartida o almacenarlas en una ubicación compartida, como SQL o Azure Storage. Para hacerlo, deberá escribir su propio proveedor de claves, implementando un IXmlRepository . Una vez que tenga las claves compartidas, puede establecer un identificador de aplicación fijo utilizando SetApplicationName durante la configuración de protección de datos.