繁体   English   中英

ASP.NET Core 共享 Cookie 问题

[英]ASP.NET Core Shared Cookie Issue

我已经阅读了 MS 说明和 SO 上的几个线程......我没有想法。 我有 2 个 .net core 3.0 Web 应用程序。 我使用 Okta 进行身份管理,并希望能够在我的应用程序之间进行 SSO - 这一切都在本地运行良好。

但是,当我部署到我在Azure的开发环境中时,却不行,因为站点1写的cookies不能被站点2读取。我想,哦,当然,解决办法就是修复cookie领域。 但这也不起作用。

所以这就是我所在的位置:

站点一:dev-app.mysite.com 站点二:dev.mysite.com

如果我没有明确设置 cookie 域,站点 1 将使用 dev-app.mysite.com 作为 cookie 写入 cookie。

如果我确实将 cookie 域明确设置为“.mysite.com”(根据文档),那么我有一个更大的问题——站点 1 根本看不到它!

这是相关代码(在两个应用程序中相同)

            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 = Microsoft.AspNetCore.Http.SameSiteMode.None;
                options.Secure = CookieSecurePolicy.Always;
            });

以及我在哪里设置身份验证 cookie:

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddCookie(options =>
            {
                options.LoginPath = new PathString("/Account/SignIn");
                options.Cookie.Name = cookieName;
                options.Cookie.Domain = cookieDomain;
            })
            .AddOktaMvc(oktaMvcOptions);

请注意,我已经处理了 cookie 应用程序名称、共享数据保护密钥等。唯一能解决这个问题的是域问题。

这可能是我见过的最奇怪的事情。 我发现如果我这样做,它会起作用:

options.Cookie.Domain = "mydomain.com";

但是,如果我将相同的值放入 appSettings.json 并从那里读取它。 相同的确切值,它不起作用。

我在本地调试它并发现我的变量:

                var cookieName = Configuration.GetValue<string>("SharedCookies:CookieName");

这是在调用之前声明的,超出了我使用它的范围......即使我在它旁边声明的变量完全没问题。 我不知道这怎么可能,所以我想我会尝试移动声明:

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddCookie(options =>
            {
                var cookieDomain = Configuration.GetValue<string>("SharedCookies:CookieDomain");
                var cookieName = Configuration.GetValue<string>("SharedCookies:CookieName");

                options.LoginPath = new PathString("/Account/SignIn");
                options.Cookie.Name = cookieName;
                options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
                options.Cookie.Domain = cookieDomain;
                options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
            })
            .AddOktaMvc(oktaMvcOptions);

而且...不,仍然不起作用。 我可以让它工作的唯一方法是直接输入域。 如果我逐行遍历代码,我会将其设置为与变量的值完全相同的值。 这太奇怪了。

如果有人对如何做到这一点有任何想法,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM