Мне пришлось много копать, но похоже, причина в том, что FormsAuthentication.SetAuthCookie
не поддерживает это, потому что не должно - IIS должен никогда задать пути к файлам cookie для аутентификации, и вот почему ...
Пути к файлам cookie чувствительны к регистру , поэтому:
http://site/path
http://site/PATH
Это 2 разных куки для браузера - ни один из них (IE, FX, Safari, Opera или Chrome) не отправит куки /PATH
на /path
или наоборот.
IIS нечувствителен к регистру , но всегда сбрасывает URL в регистр имени приложения ASP.
Это означает, что если приложение IIS называется «PATH»и пользователь переходит на http://site/path
, после чего он будет перенаправлен на вход в http://site/PATH/LogOn?ReturnUrl=/path
IIS / ASP.Net
. После успешного входа пользователь перенаправляется обратно на указанный ReturnUrl
., так:
- Пользователь переходит на
http://site/path
- Получает отправку на
http://site/PATH/LogOn?ReturnUrl=/path
по IIS - Вводит данные для входа и отправляет
- Response устанавливает cookie на
/PATH
, а местоположение на /path
(как определено ReturnUrl
) - Перенаправлено обратно на
http://site/path
- Браузер не распознает
/path
,он имеет cookie только для /PATH
, поэтому ничего не отправляет! - Нет файлов cookie, отправленных приложению, поэтому он перенаправляет обратно на
http://site/PATH/LogOn?ReturnUrl=/path
- Перейти кшаг 2 и повторите.
Это создает проблему для пользователей, если у них есть http://site/path
в качестве URL для приложения, которое они никогда не смогут войти в систему.
В дополнение к этому, если они уже вошли в систему http://site/PATH
и получили URL-адрес, скажем, по электронной почте http://site/path/resource/id
, им будет предложено снова войти в систему и они не смогут перейти на новыйpath.
Это означает, что, если вам не нужны /PATH
и /path
, чтобы быть совершенно разными сайтами (маловероятно, что за пределами определенных сред только UNIX), вы никогда не должны устанавливать свойство пути в куки аутентификации.