0

在将两个共享身份验证 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 为假。

4

0 回答 0