asp.net FormsAuthentication.SetAuthCookie未设置路径或域?

hgtggwj0  于 2023-11-20  发布在  .NET
关注(0)|答案(3)|浏览(120)

我有一个网页应用程序可以安装在很多域和路径。
于是:

    • 客户端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都不设置PathDomain
我所期望的是:

    • 客户端1名称。{我的网站}* -Domain = * 客户端1名称。{我的网站}* Path = /
    • 客户端2名称.{我的网站}* -Domain = * 客户端2名称.{我的网站}* Path = /
    • 演示。{mySite.com}/潜在客户1名称 * -Domain = * 演示。{mySite.com}* Path = */潜在客户1名称 *
    • 演示。{mySite.com}/潜在客户2Name * -Domain = * 演示。{mySite.com}* Path = */潜在客户2Name *
    • 演示。{mySite.com}/潜在客户名称 * -Domain = * 演示。{mySite.com}* Path = */潜在客户名称 *

我可以手动覆盖.Net的行为来显式设置这些,但我不确定为什么我需要这样做--确定这应该是设置身份验证cookie时的默认行为,或者至少是一个无需重写大块内容即可设置的选项。
我是不是漏掉了什么?有没有办法让FormsAuthentication.SetAuthCookie设置PathDomain
如果不是,什么是动态读取最好的PathDomain的最佳方法?相同的代码必须在所有站点上运行,我不想再添加一个配置密钥。

更新

以下是我目前的解决方案:

// 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应该能够做的事情,这似乎有很多变通方法。这真的是最好的方法吗?

pgky5nke

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属性。

dkqlctbz

dkqlctbz2#

Cookie是在域级别设置的,并且是静态的。默认情况下,FormsAuthentication使用cookie来设置它,在本例中为{mySite.com}。为了使其特定,您必须告诉它使用client1Name.{mySite.com}。但是,这样做会将Cookie限制在特定的子域中,并且子域client2Name将不再能够访问Cookie。
Cookie的路径限制了Cookie应用到的子文件夹。在FormsAuthentication的情况下,默认设置为根/。您可以手动将其设置为其他文件夹,但同样,通过将其设置为/prospect1Name,所有其他文件夹立即失去对Cookie的访问。
我不确定您试图使用这些约束来产生什么行为,但Cookie不太可能是实现此目的的合适工具。与域混淆将限制您的身份验证控制的有效性(除非这正是您试图做的)。

mwkjh3gx

mwkjh3gx3#

很长一段时间后,我遇到了同样的问题。我尝试了各种方法,但都没有找到可行的解决方案。直到我意识到我可以使用cookie名称而不是路径,这样就可以保持Path =“/”良好的行为,同时拥有不同的basePath访问。(您仍然需要能够通过环境变量或其他方式(而不是从url)检索应用程序名称。
只需在配置时执行以下操作

builder.Services.ConfigureApplicationCookie(options =>
{
    // someconfigs options
    ... 

    options.Cookie.Name = $".AspNetCore.Identity.Application.{AppName}"; // Important thing to dissociate apps (find your appname by search in iis before or environment variable)
    options.Cookie.Path = "/"; // Important thing
});

字符串

相关问题