在将两个共享身份验证 cookie 的应用程序(一个 .net 4.6 另一个 .net core 2.2)部署到网络场环境时,“接收”应用程序不会进行身份验证。我们有一个非常大的 Web 表单应用程序,我们正试图最终迁移到 .net 核心,所以现在我们正在处理 Web 表单应用程序中的身份验证,并尝试与 .net 核心应用程序共享该身份验证。我们已将 Web 表单应用程序中的身份验证升级为基于 OWIN/Katana cookie 的身份验证。这些应用程序部署在同一站点 (server.com/app1 server.com/app2) 下的同一服务器上。在本地一切正常,您登录一个并移动到另一个,您仍然处于登录状态。当我们部署到负载平衡的服务器时,.net 核心应用程序接收到 cookie,但 isAuthenticated 是错误的。
我已经能够手动解密 .net 核心应用程序中的 cookie,它能够打印出其中包含的声明,但 IsAuthenticated 标志仍然是错误的。我尝试更改 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,因为它在本地运行,但用户身份为空且 isAuthenticated 为假。