如何在域和子域之间共享 cookie,但不共享其他子域
How to share cookie between domain and subdomain, but not other subdomains
我们的 ASP.NET MVC 网络应用程序有几个不同的子域,我们用于测试和遗留代码。子域是:
- www.sitename.com(制作现场)
- test.sitename.com(测试)
- original.sitename.com(遗留代码)
- staging.sitename.com(偶尔用于在部署前进行测试)
我们有意让表单身份验证不使用域级 cookie,因为我们希望 cookie 在这些不同的子域中是唯一的。问题是,当人们获得根域 (sitename.com) 的 link 时,即使他们已经登录到 [=29=,也需要他们重新登录才能获得 cookie ].
有没有办法在 仅 www.sitename.com 和 sitename.com 之间共享 cookie,而不影响其他子域?
您可以通过使用 >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>
我建议强制使用 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>
这将永久自动重定向(请参阅 redirectType="Permanent" 的添加)将非 www URL 自动重定向到 www 等价物并保留 HTTP(s) 协议。
trackAllCaptures 部分与正则表达式模式匹配有关——在我们的例子中,我们不需要捕获任何东西;我们只需要匹配规则,所以我们可以保留为 false。
当主机名与 "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
你可以使用像
这样的东西
sessionCookie.Domain = ".yourdomain.com" ;
然后您将能够从任何子域请求相同的 cookie 并根据需要进行编辑。
我们的 ASP.NET MVC 网络应用程序有几个不同的子域,我们用于测试和遗留代码。子域是:
- www.sitename.com(制作现场)
- test.sitename.com(测试)
- original.sitename.com(遗留代码)
- staging.sitename.com(偶尔用于在部署前进行测试)
我们有意让表单身份验证不使用域级 cookie,因为我们希望 cookie 在这些不同的子域中是唯一的。问题是,当人们获得根域 (sitename.com) 的 link 时,即使他们已经登录到 [=29=,也需要他们重新登录才能获得 cookie ].
有没有办法在 仅 www.sitename.com 和 sitename.com 之间共享 cookie,而不影响其他子域?
您可以通过使用 >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>
我建议强制使用 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>
这将永久自动重定向(请参阅 redirectType="Permanent" 的添加)将非 www URL 自动重定向到 www 等价物并保留 HTTP(s) 协议。
trackAllCaptures 部分与正则表达式模式匹配有关——在我们的例子中,我们不需要捕获任何东西;我们只需要匹配规则,所以我们可以保留为 false。
当主机名与 "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
你可以使用像
这样的东西sessionCookie.Domain = ".yourdomain.com" ;
然后您将能够从任何子域请求相同的 cookie 并根据需要进行编辑。