Asp.Net 核心:在网络场中共享身份验证 cookie 不起作用
Asp.Net Core: Sharing authentication cookies in Web Farm doesn't work
我有一个 ASP.NET Core 3.1 应用程序,它使用 cookie 身份验证并在网络场上运行。
我希望应用程序在 Web 服务器之间共享经过身份验证的 cookie。
问题是当我通过负载平衡器登录服务器 A 时,来自服务器 B 的下一个 ajax 请求重定向回登录页面。 (状态代码 302,设置 Cookie:.AspNet.SharedCookie=;)
如果我直接登录到服务器 A 并浏览页面 - 它工作正常。所以我怀疑服务器 B 没有验证服务器 A 生成的 cookie。
这是 DataProtection 的配置:
services.AddDataProtection(options =>
{
options.ApplicationDiscriminator = "MyApp";
})
.PersistKeysToFileSystem(new DirectoryInfo(GetKeysPath()))
.SetApplicationName("MyApp")
.SetDefaultKeyLifetime(TimeSpan.FromDays(365));
和身份验证:
services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.LoginPath = "/Login/Login";
options.LogoutPath = "/Login/Logout";
options.ReturnUrlParameter = "returnUrl";
options.Cookie.Name = ".AspNet.SharedCookie";
options.Cookie.Path = "/";
options.Cookie.IsEssential = true;
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
});
有人知道我错过了什么吗?
P.S.Initial 我在使用 DataProtection 时遇到的问题,每个服务器都生成自己的密钥,这样其他服务器就无法解密 cookie 和防伪令牌。所以我将相同的密钥文件复制到每个服务器,问题就消失了。
我使用的链接:
我找到了问题的根本原因,问题不在 DataProtection、Authentication 或 Cookies 中。
问题出在 Session 上,它使用内存来存储会话,因此其他服务器(创建的服务器除外)对会话一无所知。所以我在数据库中添加了存储会话,就像这样:
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString =
_config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
最后,我的网络场运行良好。
我有一个 ASP.NET Core 3.1 应用程序,它使用 cookie 身份验证并在网络场上运行。 我希望应用程序在 Web 服务器之间共享经过身份验证的 cookie。 问题是当我通过负载平衡器登录服务器 A 时,来自服务器 B 的下一个 ajax 请求重定向回登录页面。 (状态代码 302,设置 Cookie:.AspNet.SharedCookie=;)
如果我直接登录到服务器 A 并浏览页面 - 它工作正常。所以我怀疑服务器 B 没有验证服务器 A 生成的 cookie。 这是 DataProtection 的配置:
services.AddDataProtection(options =>
{
options.ApplicationDiscriminator = "MyApp";
})
.PersistKeysToFileSystem(new DirectoryInfo(GetKeysPath()))
.SetApplicationName("MyApp")
.SetDefaultKeyLifetime(TimeSpan.FromDays(365));
和身份验证:
services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.LoginPath = "/Login/Login";
options.LogoutPath = "/Login/Logout";
options.ReturnUrlParameter = "returnUrl";
options.Cookie.Name = ".AspNet.SharedCookie";
options.Cookie.Path = "/";
options.Cookie.IsEssential = true;
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
});
有人知道我错过了什么吗?
P.S.Initial 我在使用 DataProtection 时遇到的问题,每个服务器都生成自己的密钥,这样其他服务器就无法解密 cookie 和防伪令牌。所以我将相同的密钥文件复制到每个服务器,问题就消失了。
我使用的链接:
我找到了问题的根本原因,问题不在 DataProtection、Authentication 或 Cookies 中。 问题出在 Session 上,它使用内存来存储会话,因此其他服务器(创建的服务器除外)对会话一无所知。所以我在数据库中添加了存储会话,就像这样:
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString =
_config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
最后,我的网络场运行良好。