如何在域和子域之间共享cookie,但不在其他子域之间共享cookie

问题描述 投票:10回答:3

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

  1. www.sitename.com(生产现场)
  2. test.sitename.com(测试)
  3. original.sitename.com(遗留代码)
  4. staging.sitename.com(偶尔用于在部署之前进行测试)

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

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

asp.net cookies subdomain iis-8
3个回答
3
投票

我建议强制使用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 URL永久自动重定向(请参阅redirectType =“Permanent”的添加)到www等效并保留HTTP(s)协议。

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

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

重写地图来自杰夫格雷夫斯的想法,我相信,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


5
投票

您可以通过> 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> 

0
投票

你可以使用一些东西

sessionCookie.Domain = ".yourdomain.com" ;

然后,您将能够从任何子域请求相同的cookie并根据需要进行编辑。

© www.soinside.com 2019 - 2024. All rights reserved.