当部署两个共享身份验证cookie到Web服务器场环境的应用程序(一个.net 4.6和另一个.net core 2.2)时,“接收”应用程序不进行身份验证。我们有一个非常大的Web窗体应用程序,我们正试图最终迁移到.net核心,因此现在我们正在Web窗体应用程序中处理身份验证,并尝试与.net核心应用程序共享该身份验证。我们已将Web表单应用程序中的身份验证升级为基于OWIN / Katana cookie的身份验证。这些应用程序部署在同一站点(server.com/app1 server.com/app2)的相同服务器上。在本地一切正常,您登录一个并转移到另一个,然后仍然登录。当我们将服务器部署到负载平衡的服务器时,.net核心应用程序会接收cookie,但是isAuthenticated为false。
我已经能够在.net核心应用程序中手动解密cookie,并且能够打印出其中包含的声明,但是IsAuthenticated标志仍然为false。我尝试更改cookie域,cookie路径,安全策略和身份验证类型,但均未成功。
Web窗体应用程序Startup.cs:
var provider = DataProtectionProvider.Create(new DirectoryInfo(System.Configuration.ConfigurationManager.AppSettings["KeyRingLocation"]),
(builder) => {
builder.SetApplicationName("sharedApp");
builder.PersistKeysToFileSystem(new DirectoryInfo(System.Configuration.ConfigurationManager.AppSettings["KeyRingLocation"]));
});
IDataProtector protector = provider.CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
"Identity.Application",
"v2");
app.UseCookieAuthentication(new Microsoft.Owin.Security.Cookies.CookieAuthenticationOptions
{
CookieName = ".AspNet.SharedCookie",
LoginPath = new PathString("/Login.aspx"),
CookiePath = "/",
AuthenticationType = "Identity.Application",
CookieSecure = Microsoft.Owin.Security.Cookies.CookieSecureOption.Always,
CookieDomain = System.Configuration.ConfigurationManager.AppSettings["CookieDomain"],
TicketDataFormat = new AspNetTicketDataFormat(new DataProtectorShim(protector)),
CookieManager = new ChunkingCookieManager()
});
.net核心应用程序Startup.cs:
services.AddDataProtection()
.SetApplicationName("sharedApp")
.PersistKeysToFileSystem(new DirectoryInfo(Configuration.GetSection("KeyRingLocation").Value));
services.AddAuthentication("Identity.Application")
.AddCookie("Identity.Application", options =>
{
options.Cookie.Name = ".AspNet.SharedCookie";
options.Cookie.Domain = Configuration.GetSection("CookieDomain").Value;
options.Cookie.Path = "/";
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
网络表单登录代码:
...
var auth = Context.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("Identity.Application");
identity.AddClaim(new Claim(ClaimTypes.Name, profile.UserName));
...
auth.SignIn(identity);
没有引发任何错误,因此很难确定问题所在。我希望它会像在本地运行一样尊重身份验证cookie,但是用户身份为null,isAuthenticated为false。