使用Azure中的ASP.NET Core在Redis中保存用户会话

我正在使用Redis缓存在项目中保存一些内容。

我使用的是Azure(WebApp),当我在预生产环境与生产环境之间执行SWAP时,用户会话丢失了,他需要在我的网页中重新登录。

我正在使用Identity 3.0和UseCookieAuthentication。我想将“会话”存储在Redis中,以解决交换时遇到的问题。

我没有找到相关信息,有什么想法吗?谢谢

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"));

}

// 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" });

});

}

回答:

会话未链接到身份验证,您正在尝试以错误的方式解决它。

所有表单身份验证票证和cookie均使用数据保护层进行加密和签名。您遇到的问题是由于未保存加密密钥,并且应用程序彼此隔离。

为了解决它,您必须共享两个加密密钥并在代码中设置一个应用程序名称。老实说,我建议你不要。试生产不是现场服务,您不应该一次对两者进行身份验证。

如果您觉得必须这样做,则需要共享加密密钥环,并设置一个固定的应用程序名称。您可以通过共享文件夹或通过将密钥存储在共享位置(例如SQL或Azure存储)来共享密钥。为此,您必须通过实现IXmlRepository来编写自己的密钥环提供程序。共享密钥后,就可以在数据保护配置过程中使用SetApplicationName来设置固定的应用程序标识符。

以上是 使用Azure中的ASP.NET Core在Redis中保存用户会话 的全部内容, 来源链接: utcz.com/qa/403416.html

回到顶部