我已将我的 mvc 应用程序从 .net core 2.2 转换为 .net 8.0,但是当它运行时,它没有显示登录页面,而是抛出如下错误,
我正在使用 Redis 会话。我已经设置如下配置,
services.AddStackExchangeRedisCache(option =>
{
option.Configuration = Configuration.GetConnectionString("AzureRedisConnection");
option.InstanceName = !string.IsNullOrEmpty(Configuration.GetSection("SessionSettings")["RedisInstancePrefix"]) ? Configuration.GetSection("SessionSettings")["RedisInstancePrefix"] : "CrmStep_";
});
services.AddSession(options =>
{
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
options.Cookie.MaxAge = TimeSpan.FromHours(24);
options.IOTimeout = TimeSpan.FromMinutes(!string.IsNullOrEmpty(Configuration.GetSection("SessionSettings")["IOTimeOut"]) ? Convert.ToDouble(Configuration.GetSection("SessionSettings")["IOTimeOut"]) : 1440);
options.IdleTimeout = TimeSpan.FromMinutes(!string.IsNullOrEmpty(Configuration.GetSection("SessionSettings")["IdleTimeOut"]) ? Convert.ToDouble(Configuration.GetSection("SessionSettings")["IdleTimeOut"]) : 1440);
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Login";
options.Cookie.HttpOnly = true;
options.SlidingExpiration = true;
options.Cookie.Expiration = TimeSpan.FromHours(24);
options.ExpireTimeSpan = TimeSpan.FromHours(24);
options.Cookie.MaxAge = TimeSpan.FromHours(24);
});
app.UseHttpsRedirection();
app.UseCookiePolicy();
app.UseStaticFiles();
app.UseForwardedHeaders();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
请任何人帮忙解决这个问题,谢谢!
根据错误信息,你会发现你应该使用
options.ExpireTimeSpan = TimeSpan.FromHours(24);
而不是options.Cookie.Expiration = TimeSpan.FromHours(24);
。
这是新版本,它控制存储在 cookie 中的身份验证票证从创建之日起保持有效的时间。过期信息存储在受保护的 cookie 票证中。因此,即使在浏览器应该清除它之后将其传递到服务器,过期的 cookie 也会被忽略。
这与 Expires 的值是分开的,Expires 指定浏览器将保留 cookie 的时间。
使用下面的代码,效果会很好。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Login";
options.Cookie.HttpOnly = true;
options.SlidingExpiration = true;
options.Cookie.Expiration = TimeSpan.FromHours(24);
//options.ExpireTimeSpan = TimeSpan.FromMinutes(120);
options.Cookie.MaxAge = TimeSpan.FromHours(24);
});