我有一个Web应用程序可以安装在许多域和路径上。
所以:
- client1Name.{mySite.com}
- client2Name.{mySite.com}
- demo.{mySite.com}/prospect1Name
- demo.{mySite.com}/prospect2Name
- demo.{mySite.com}/prospect3Name
所有这些都是相同代码的单独应用程序实例。
问题在于,如果客户端登录到client1Name.{mySite.com},然后访问其他站点,他们的浏览器将发送验证cookie。
在所有情况下,FormsAuthentication.SetAuthCookie
都不会设置Path
或Domain
。
我期望的是:
- client1Name.{mySite.com} -
Domain
= client1Name.{mySite.com},Path
= / - client2Name.{mySite.com} -
Domain
= client2Name.{mySite.com},Path
= / - demo.{mySite.com}/prospect1Name -
Domain
= demo.{mySite.com},Path
= /prospect1Name - demo.{mySite.com}/prospect2Name -
Domain
= demo.{mySite.com},Path
= /prospect2Name - demo.{mySite.com}/prospect3Name -
Domain
= demo.{mySite.com},Path
= /prospect3Name
我可以手动覆盖.NET的行为以显式设置这些内容,但我不确定为什么需要这样做-当设置身份验证cookie时,这应该是默认行为或至少可以设置的选项,而无需重写大块代码。
我有什么遗漏吗?是否有一种方法可以使FormsAuthentication.SetAuthCookie
设置Path
和Domain
?
如果没有,最好的方法是动态读取最佳的Path
和Domain
是什么?同一代码必须在所有站点上运行,我不想添加更多的配置键。
更新
这是我的当前解决方案:
// replacement for FormsAuthentication.SetAuthCookie(user.UserName, false);
// as that fails to limit the cookie by domain & path and fails.
var cookie = FormsAuthentication.GetAuthCookie(username, false);
cookie.HttpOnly = true;
cookie.Path = this.Request.ApplicationPath;
cookie.Secure = string.Equals("https", this.Request.Url.Scheme, StringComparison.OrdinalIgnoreCase);
// the browser will ignore the cookie if there are fewer than two dots
// see cookie spec - http://curl.haxx.se/rfc/cookie_spec.html
if (this.Request.Url.Host.Split('.').Length > 2)
{
// by default the domain will be the host, so www.site.com will get site.com
// this may be a problem if we have clientA.site.com and clientB.site.com
// the following line will force the full domain name
cookie.Domain = this.Request.Url.Host;
}
this.Response.Cookies.Add(cookie);
然而,这似乎是在做很多绕路的事情,FormsAuthentication.SetAuthCookie
应该能够完成。这真的是最好的方法吗?
{mySite.com}
,路径应该始终为/
。 - Joel Etherton