【问题标题】:How to share cookie between domain and subdomain, but not other subdomains如何在域和子域之间共享cookie,而不是其他子域
【发布时间】:2016-08-16 06:23:59
【问题描述】:

我们的 ASP.NET MVC Web 应用程序有几个不同的子域,我们用于测试和遗留代码。子域是:

  1. www.sitename.com(生产站点)
  2. test.sitename.com(测试中)
  3. original.sitename.com(旧代码)
  4. staging.sitename.com(有时用于在部署前进行测试)

我们故意让表单身份验证不使用域级别的 cookie,因为我们希望 cookie 在这些不同的子域中是唯一的。问题是,当人们获得指向根域 (sitename.com) 的链接时,即使他们已经登录到 www.sitename.com,也需要他们再次登录才能获得 cookie。

有没有办法在 www.sitename.com 和 sitename.com 之间共享 cookie 而不会影响其他子域?

【问题讨论】:

  • 您可以将所有 sitename.com 重定向到 www.sitename.com,反之亦然,以免出现此类问题。
  • 我该怎么做?

标签: asp.net cookies subdomain iis-8


【解决方案1】:

我建议强制使用 www.该网站的版本,因此,除其他外,该网站有很好的理由...

http://www.yes-www.org/why-use-www/

要在 .net 中执行此操作,您可以将以下内容添加到您的 web.config

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Redirect to www" stopProcessing="true">
        <match url="(.*)" />
        <conditions trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="^sitename.com$" />
        </conditions>
        <action type="Redirect" url="{MapProtocol:{HTTPS}}://www.{HTTP_HOST}{HTTP_URL}" redirectType="Permanent"/>
      </rule>
    </rules>
    <rewriteMaps>
      <rewriteMap name="MapProtocol">
        <add key="on" value="https" />
        <add key="off" value="http" />
      </rewriteMap>
    </rewriteMaps>
  </rewrite>
</system.webServer>

这将为非 www 网址永久自动重定向(请参阅添加的 redirectType="Permanent")到等效的 www 并保留 HTTP(s) 协议。

trackAllCaptures 部分与正则表达式模式匹配有关——在我们的例子中,我们不需要捕获任何东西;我们只需要匹配规则,所以我们可以保留为假。

当主机名与“sitename.com”完全匹配时,正则表达式模式 ^sitename.com$ 将匹配 - ^ 表示开始位置,$ 表示结束位置

重写地图来自 Jeff Graves 的一个想法,我相信,http://jeffgraves.me/2012/11/06/maintain-protocol-in-url-rewrite-rules/

我所展示的方式只显示了一种方法,就像大多数事情一样 - 有多种方法可以实现这一目标。

Scott Forsyth 也有一篇关于实现这一目标的不同方式的文章(也参考了 Jeff Graves) http://weblogs.asp.net/owscott/url-rewrite-protocol-http-https-in-the-action

【讨论】:

  • 我注意到你的答案与额尔古纳的不同,因为你的条件节点有trackAllCaptures="false"。这是怎么回事?
  • trackAllCaptures 用于正则表达式来定义匹配字符串是否应包含在结果索引中 - 您可以在此处找到更多详细信息 iis.net/learn/extensions/url-rewrite-module/… - 我们只匹配主机名和对捕获任何东西都不感兴趣,所以我们可以将其保留为 false
【解决方案2】:

你可以使用类似的东西

sessionCookie.Domain = ".yourdomain.com" ;

那么您将能够从任何子域请求相同的 cookie 并根据需要对其进行编辑。

【讨论】:

  • 答案是专门要求一种方法,不要在所有子域之间共享 cookie,而只在特定子域之间共享。
【解决方案3】:

您可以通过在 >IIS7 中使用 UrlRewrite 模块将非 www 域重定向到 www 来避免此问题

重写规则放入web.config

<system.webServer>
<rewrite>
    <rules>
      <rule name="Redirect to WWW" stopProcessing="true">
        <match url=".*" />
        <conditions>
          <add input="{HTTP_HOST}" pattern="^example.com$" />
        </conditions>
        <action type="Redirect" url="http://www.example.com/{R:0}"
             redirectType="Permanent" />
      </rule>
        </rules>
    </rewrite>
</system.webServer> 

【讨论】:

  • 如果这是一个愚蠢的问题,请原谅我,但pattern="^example.com$" 不会接听例如 test.example.com?
  • "www" 是另一个子域,与此模式的 test.example.com 没有什么不同。该模式对于只有“example.com”的非子域地址是正确的
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2021-03-23
  • 2017-05-14
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多