У меня есть два экземпляра веб-приложения .Net Core 2.2 (test & test2), работающего как службы Linux, за обратным прокси-сервером Apache2. Я пытаюсь разделить сеанс между обоими приложениями.
Проблема в том, что application1 запускает создание cookie-файла сеанса по пути /. Application2 запускает собственный сеанс и записывает то же имя файла cookie в путь /. Попытка выяснить, почему application2 не видит существующий cookie-файл application1, и использовать его вместо создания нового сеанса, перезаписывающего сеанс application1.
Я думаю, что это проблема с моей конфигурацией .conf, так как оба приложения работают, как и ожидалось, в рамках своих изолированных сеансов. Просто когда я пытаюсь поделиться через обратный прокси, я вижу проблему. Я также не эксперт по Apache, поэтому очень вероятно, что я что-то упустил или что-то там не так.
Startup.cs
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.Lax;
});
services.AddDistributedMemoryCache();
int sessionTimeout = int.Parse(_configuration["Hosting:SessionTimeout"]);
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(sessionTimeout);
options.Cookie.SameSite = SameSiteMode.Strict;
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
options.Cookie.Name = "session";
});
services.AddHttpContextAccessor();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
ClassLibrary.Mvc.Constants.PathBase = string.Empty;
if (!string.IsNullOrEmpty(_configuration["Hosting:RoutePath"]))
{
string routePath = _configuration["Hosting:RoutePath"].Trim();
if (routePath[0] != '/')
routePath = "/" + routePath;
if (routePath[routePath.Length - 1] == '/')
routePath = routePath.Substring(0, (routePath.Length - 1));
app.UsePathBase(routePath);
ClassLibrary.Mvc.Constants.PathBase = routePath;
_logger.Information($"Route Path: {routePath}");
}
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseHttpsRedirection();
app.UseCookiePolicy();
app.UseStaticFiles();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
application.conf
<VirtualHost *:443>
SSLEngine On
SSLUseStapling Off
SSLCertificateFile /etc/apache2/ssl/application.cdcavell.tst/certificate.crt
SSLCertificateKeyFile /etc/apache2/ssl/application.cdcavell.tst/certificate.key
DocumentRoot "/var/www/Application"
ServerName application.cdcavell.tst
ServerAdmin cdcavell@gmail.com
ErrorLog /var/www/Application/logs/apache2-error.log
CustomLog /var/www/Application/logs/apache2-access.log common
LogLevel Error
Session On
ProxyPreserveHost On
SSLProxyEngine On
SSLProxyVerify None
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
<Location "/test">
ProxyPass "https://127.0.0.1:5020/test"
ProxyPassReverse "https://127.0.0.1:5020/test"
ProxyPassReverseCookiePath "/test" "/"
Order allow,deny
Allow from all
</Location>
<Location "/test2">
ProxyPass "https://127.0.0.1:5023/test2"
ProxyPassReverse "https://127.0.0.1:5023/test2"
ProxyPassReverseCookiePath "/test2" "/"
Order allow,deny
Allow from all
</Location>
</VirtualHost>
Полный источник: Функция ветки GitHub / 0.3.0