asp.net-core - .NetCore 5 会话在发布后未启动
问题描述
我正在使用 .NetCore API 和 MVC。一切都在本地服务器上运行。但是在发布站点后不会发生会话。项目运作如下:
- 用户带有令牌 ID 到网站。
- 我正在解析它,然后将重要变量保存到会话中。
- 我从会话中获取值。...
如您所见,如果我在会话中遇到错误,其他步骤将失败。我尝试了太多方法,但都没有奏效。我正在添加 Startup.cs/ConfigureServices 和 Configure 方法。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages().AddRazorRuntimeCompilation();
services.AddMvc().AddControllersAsServices();
services.AddWkhtmltopdf("wkhtmltopdf");
services.AddHttpContextAccessor();
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.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(600);//You can set Time
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.SameSite = SameSiteMode.Strict;
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
services.AddAuthentication();
services.AddScoped<Business.Business, Business.Business>();
services.AddSingleton<SharedViewLocalizer>();
#region Localization and Language
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var cultures = new[] {
new CultureInfo("tr-TR"),
new CultureInfo("en-US"),
new CultureInfo("de-DE"),
};
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = cultures;
options.SupportedUICultures = cultures;
});
#endregion
services.AddMvc(option =>
{
option.EnableEndpointRouting = false;
})
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix,
opts => { opts.ResourcesPath = "Resources"; })
.AddDataAnnotationsLocalization();
services.AddRazorPages();
services.AddServerSideBlazor();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseDeveloperExceptionPage();
//app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
#region Language Options
var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
var cookieProvider = options.Value.RequestCultureProviders
.OfType<CookieRequestCultureProvider>()
.First();
var urlProvider = options.Value.RequestCultureProviders
.OfType<QueryStringRequestCultureProvider>().First();
cookieProvider.Options.DefaultRequestCulture = new RequestCulture("tr-TR");
urlProvider.Options.DefaultRequestCulture = new RequestCulture("tr-TR");
cookieProvider.CookieName = CookieRequestCultureProvider.DefaultCookieName;
options.Value.RequestCultureProviders.Clear();
options.Value.RequestCultureProviders.Add(cookieProvider);
options.Value.RequestCultureProviders.Add(urlProvider);
app.UseRequestLocalization(options.Value);
#endregion
app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseSession();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
#region Routing
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
"areas",
"{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Login}/{id?}");
endpoints.MapRazorPages();
//endpoints.MapBlazorHub();
//endpoints.MapFallbackToController("Index", "Home");
});
#endregion
}
解决方案
options.Cookie.SameSite = SameSiteMode.None
必须用于允许跨站点 cookie 使用。
https://docs.microsoft.com/en-us/aspnet/core/security/samesite?view=aspnetcore-5.0
中间件的顺序很重要。在 UseRouting 之后和 UseEndpoints 之前调用 UseSession。请参阅中间件排序。
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-5.0
如果您的生产环境由多台服务器组成,那么简单的方法(但不是推荐的方法)是在负载均衡器中启用粘性会话。
使用多台服务器时,推荐使用分布式缓存。更多信息:https ://dzone.com/articles/aspnet-core-session-storage-strategies
您应该考虑根本不使用会话,这将使您的事情变得更容易。
推荐阅读
- html - CSS:使用引导程序 3 的表单控件对齐
- c# - C# & Razor:在 ASP.NET 中使用 HTML 表的动态日历
- android - Android 导航架构组件 - 导航架构组件是否意味着仅使用单个活动?
- neo4j - 如何在 Neo4j 浏览器中显示节点/关系图
- c# - 为 SOAP 请求生成 XML 时出错
- deep-learning - 在深度学习中,两个 3*3 卷积滤波器和一个 5*5 卷积滤波器有什么区别?
- ios - 在后台运行 Xamarin.ios 中 ViewModels 中的方法
- javascript - 用新数据重新填充选项卡
- python - CVXPY 中的违反约束
- java - Docusign Jar 与泽西岛的冲突