【问题标题】:sharing cookies between websites在网站之间共享 cookie
【发布时间】:2021-09-18 03:17:24
【问题描述】:

我指的是下面的教程在本地运行的 2 个不同的 MVC 应用程序之间共享 cookie,

https://docs.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-5.0

BaseApp2 : 在 https://localhost:44363/ 运行具有以下配置

 public void ConfigureServices(IServiceCollection services)
    {
        DirectoryInfo di = new DirectoryInfo(@"C:\SharedCookies");
        services.AddDataProtection()
        .PersistKeysToFileSystem(di)
        .SetApplicationName("SharedCookieApp");

        services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.Name = ".AspNet.SharedCookie";
        });

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
          .AddCookie(options =>
          {
              options.LoginPath = new PathString("/Account/SignIn");
          })
          .AddOktaMvc(new OktaMvcOptions
          {
              // Replace these values with your Okta configuration
              OktaDomain = Configuration.GetValue<string>("Okta:OktaDomain"),
              ClientId = Configuration.GetValue<string>("Okta:ClientId"),
              ClientSecret = Configuration.GetValue<string>("Okta:ClientSecret"),
              AuthorizationServerId = Configuration.GetValue<string>("Okta:AuthorizationServerId"),
              Scope = new List<string> { "openid", "profile", "email" },

          });
        services.AddControllersWithViews();
    }

应该重用在 https://localhost:44309/ 上运行的 baseapp2 cookie 的 Subapp1 具有以下配置,

 public void ConfigureServices(IServiceCollection services)
    {
        DirectoryInfo di = new DirectoryInfo(@"C:\SharedCookies");
        services.AddDataProtection()
        .PersistKeysToFileSystem(di)
        .SetApplicationName("SharedCookieApp");

        services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.Name = ".AspNet.SharedCookie";
            options.Cookie.Path = @"C:\SharedCookies";// "/";
        });

        services.AddControllersWithViews();
    }

当我成功登录到 baseapp2 时,我可以看到 cookie 正在其域中创建。并且它也被保存到那里提到的物理路径。但是我无法使用该 cookie 登录到第二个应用程序?

有什么遗漏吗?请帮忙。

附上截图

【问题讨论】:

  • 截图中“域”列的值是多少?

标签: c# .net authentication cookies model-view-controller


【解决方案1】:

两个不同的域(例如 mydomain.com 和 subdomain.mydomain.com,或 sub1.mydomain.com 和 sub2.mydomain.com)只有在 Set-Cookie 标头中明确命名域时才能共享 cookie。否则,cookie 的范围仅限于请求主机。 (这被称为“仅限主机的 cookie”。请参阅 What is a host only cookie?

您的网址不同!

您可以在 IIS 中使用virtual directorySub Domain

所有现代浏览器都遵循较新的规范 RFC 6265,并且会忽略任何前导点,这意味着您可以在子域以及顶级域上使用 cookie。

【讨论】:

    【解决方案2】:

    你的 cookie 有奇怪的 Path 值:

    Path 属性指定该 Cookie 应用到的源服务器上的 URI 子集。如果未指定此属性,则此 Cookie 将发送到源服务器或服务器上的所有页面。

    • 可能您需要 / 用于两个网站。
    • 也可以指定相同的 cookie 域(在开发中不需要,可能在生产中,具体取决于应用的部署方式)。

    【讨论】:

    • 对于 Subapp1 我保留了 Options.Cookie.Path="/";即使这样,它也不能在本地工作。
    • * 我会首先检查 cookie 是否与浏览器的网络选项卡中对 Subapp2 的所有请求一起发送,如果不是,两个应用程序的路径和/或域可能不匹配。 * 登录 baseapp2 后,使用开发工具(尤其是路径和域属性)检查 cookie 在浏览器中的存储方式
    • 嗨@rekna,我附上了截图供参考
    • 它们都在我的 Visual Studio 机器的本地主机上运行。所以我认为服务器应该是一样的。
    • 不知道这是否与它有关,但是。 Net Core 区分了必需 cookie 和非必需 cookie。 opts.Cookie.IsEssential = true;?非必要的 cookie 在发送之前需要征得同意...可能值得一试
    【解决方案3】:

    删除 options.Cookie.Path = @"C:\SharedCookies";// "/";来自 subapp1 的行 要么 将其添加到基本应用配置中。

    我做过类似的事情,我不需要明确指定 cookie 路径。

    【讨论】:

      【解决方案4】:

      你可以试试这个方法:

      创建一个在所有 3 个域上设置 cookie 的文件。然后创建一个 HTML 文件,该文件将加载在其他 2 个域上设置 cookie 的文件。示例:

      <html>
         <head></head>
         <body>
            <p>Please wait.....</p>
            <img src="http://domain2.com/setcookie?theme=1" />
            <img src="http://domain3.com/setcookie?theme=2" />
         </body>
      </html>
      
      

      然后在 body 标签上添加一个 onload 回调。只有当图像完全加载,即在其他 2 个域上设置 cookie 时,文档才会加载。

      如果您可以在 C# 中创建此功能,那么您可以在网站之间共享 cookie

      【讨论】:

        猜你喜欢
        • 2012-09-04
        • 2013-02-02
        • 1970-01-01
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        相关资源
        最近更新 更多