FormsAuthentication.SetAuthCookie не устанавливаете путь или домен?

У меня есть веб-приложение, которое можно установить на множество доменов и путей.

Итак:

  • client1Name. {mySite.com}
  • client2Name. {mySite .com}
  • demo. {mySite.com} / prospect1Name
  • demo. {mySite.com} / prospect2Name
  • demo. {mySite.com} / prospect3Name

Все отдельные экземпляры приложения с одним и тем же кодом .

Проблема в том, что если клиент входит в систему на client1Name. {MySite.com} , затем посещает один из других сайтов, их браузер отправляет файл cookie аутентификации.

Во всех случаях ] FormsAuthentication.SetAuthCookie не устанавливает ни Путь , ни Домен .

Я бы ожидал:

  • client1Name. {MySite.com} - Домен = client1Name. {MySite.com} Путь = /
  • client2Name. {MySite.com} - Домен = client2Name. {MySite.com} Путь = /
  • демо. {MySite.com} / prospect1N ame - Домен = демонстрация. {mySite.com} Путь = / prospect1Name
  • демонстрация. {mySite.com} / prospect2Name - Домен = демонстрация. {MySite.com} Путь = / prospect2Name
  • демонстрация. {MySite.com} / prospect3Name - Домен = демонстрация. {MySite.com} Путь = / prospect3Name

Я могу вручную переопределить поведение .Net, чтобы явно установить их, но я не конечно, зачем мне это нужно - конечно, это должно быть поведение по умолчанию при установке файла cookie аутентификации или, по крайней мере, параметр, который можно установить без повторной записи больших его фрагментов.

Я что-то упустил? Есть ли способ заставить FormsAuthentication.SetAuthCookie установить Путь и Домен ?

Если нет, то какой способ лучше всего динамически считывать ] Путь и Домен ? Один и тот же код должен работать на всех сайтах, и я не хочу добавлять дополнительный ключ конфигурации.

Обновление

Вот мое текущее решение:

// 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 должен уметь. Это действительно лучший способ?

7
задан Keith 15 July 2011 в 15:31
поделиться