我有一个网页应用程序可以安装在很多域和路径。
于是:
- 客户端1名称。{mySite.com}*
- 客户端2名称。{mySite.com}*
- 演示。{mySite.com}/潜在客户1 Name *
- 演示。{mySite.com}/潜在客户2Name *
- 演示。{mySite.com}/潜在客户3 Name *
相同代码的所有单独的应用程序示例。
问题在于,如果客户端登录到 * client 1 Name.{mySite.com}*,然后访问其他站点之一,则其浏览器将发送身份验证cookie。
在所有情况下,FormsAuthentication.SetAuthCookie
都不设置Path
或Domain
。
我所期望的是:
- 客户端1名称。{我的网站}* -
Domain
= * 客户端1名称。{我的网站}*Path
= /
- 客户端1名称。{我的网站}* -
- 客户端2名称.{我的网站}* -
Domain
= * 客户端2名称.{我的网站}*Path
= /
- 客户端2名称.{我的网站}* -
- 演示。{mySite.com}/潜在客户1名称 * -
Domain
= * 演示。{mySite.com}*Path
= */潜在客户1名称 *
- 演示。{mySite.com}/潜在客户1名称 * -
- 演示。{mySite.com}/潜在客户2Name * -
Domain
= * 演示。{mySite.com}*Path
= */潜在客户2Name *
- 演示。{mySite.com}/潜在客户2Name * -
- 演示。{mySite.com}/潜在客户名称 * -
Domain
= * 演示。{mySite.com}*Path
= */潜在客户名称 *
- 演示。{mySite.com}/潜在客户名称 * -
我可以手动覆盖.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
应该能够做的事情,这似乎有很多变通方法。这真的是最好的方法吗?
3条答案
按热度按时间pgky5nke1#
我不得不做了很多挖掘,但看起来
FormsAuthentication.SetAuthCookie
不支持这一点的原因是因为它不应该- IIS不应该在身份验证cookie上设置路径,这就是为什么......Cookie路径 * 区分大小写 *,因此:
http://site/path
的http://site/PATH
个浏览器有两种不同的cookie-它们(IE、FX、Safari、Opera或Chrome)都不会将
/PATH
的cookie发送到/path
,反之亦然。IIS * 不区分大小写 *,但会始终将URL重置为ASP应用程序名称的大小写。
这意味着,如果IIS应用程序被称为“PATH”,并且用户转到
http://site/path
,则IIS/ASP.NET将重定向到在http://site/PATH/LogOn?ReturnUrl=/path
登录成功登录后,用户将重定向回指定的
ReturnUrl
,因此:1.用户转到
http://site/path
1.由IIS发送到
http://site/PATH/LogOn?ReturnUrl=/path
1.输入登录详细信息并提交
1.响应将cookie设置为
/PATH
,将位置设置为/path
(由ReturnUrl
定义)1.重定向回
http://site/path
1.浏览器无法识别
/path
,它只有/PATH
的cookie,所以什么都不发送!1.没有cookie发送到应用程序,因此它重定向回
http://site/PATH/LogOn?ReturnUrl=/path
1.转到步骤2并重复。
如果用户将
http://site/path
作为应用程序的URL,这将给用户带来一个问题,他们将永远无法登录。此外,如果他们已经登录到
http://site/PATH
并收到一个URL,比如一封电子邮件到http://site/path/resource/id
,他们将被要求重新登录,并且无法到达新的路径。这意味着,除非您需要
/PATH
和/path
是完全不同的站点(在某些仅UNIX环境之外不太可能),否则永远不应该在身份验证Cookie上设置path属性。dkqlctbz2#
Cookie是在域级别设置的,并且是静态的。默认情况下,FormsAuthentication使用cookie来设置它,在本例中为
{mySite.com}
。为了使其特定,您必须告诉它使用client1Name.{mySite.com}
。但是,这样做会将Cookie限制在特定的子域中,并且子域client2Name将不再能够访问Cookie。Cookie的路径限制了Cookie应用到的子文件夹。在FormsAuthentication的情况下,默认设置为根
/
。您可以手动将其设置为其他文件夹,但同样,通过将其设置为/prospect1Name
,所有其他文件夹立即失去对Cookie的访问。我不确定您试图使用这些约束来产生什么行为,但Cookie不太可能是实现此目的的合适工具。与域混淆将限制您的身份验证控制的有效性(除非这正是您试图做的)。
mwkjh3gx3#
很长一段时间后,我遇到了同样的问题。我尝试了各种方法,但都没有找到可行的解决方案。直到我意识到我可以使用cookie名称而不是路径,这样就可以保持Path =“/”良好的行为,同时拥有不同的basePath访问。(您仍然需要能够通过环境变量或其他方式(而不是从url)检索应用程序名称。
只需在配置时执行以下操作
字符串