Совместное использование файлов cookie для проверки подлинности сайта ASP.NET - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть 2 интернет-сайта MVC3.Один (Site1) использует проверку подлинности Windows и находится в зоне локальной интрасети.Второй (Site2) общедоступен и использует проверку подлинности с помощью форм.Оба сайта находятся в одном домене, но имеют разные субдомены.Я хочу поделиться аутентификационными файлами cookie между ними.Для этого им нужны одинаковые настройки в веб-конфигурации.Иногда это работает, в большинстве случаев это не так.Если кто-то заходит на Site1 из-за пределов нашей сети, он получает ошибку 403, и это хорошо.Если пользователь сети входит в Site1, ему разрешается входить на основании его сетевых учетных данных.Затем я проверяю роли их пользователей с помощью приведенного ниже кода.

var userName = string.Empty;
var winId = (WindowsIdentity)HttpContext.User.Identity;
var winPrincipal = new WindowsPrincipal(winId);

if(winPrincipal.IsInRole("SiteAdmin")) {
    FormsAuthentication.SetAuthCookie("siteadmin", false);
    userName = "siteadmin"; //This is a Forms Auth user
}
else if(///I check for other roles here and assign like above)

После того, как я проверил роли, я пересылаю их на Site2, создавая для них cookie, если пользователь находится в одной из ролей, определенных воператор if ... выше.

if(!string.IsNullOrEmpty(userName)) {
    //Add a cookie that Site2 will use for Authentication
    var cookie = FormsAuthentication.GetAuthCookie(userName, false);
    cookie.Domain = FormsAuthentication.CookieDomain; //This may need to be changed to actually set the Domain to the Domain of the TVAP site.

    HttpContext.Response.Cookies.Add(cookie);
}

//Network users not found in roles will simply be forwarded without a cookie and have to login
HttpContext.Response.RedirectPermanent(tvapUrl);

Я установил в web.config соответствующий MachineKey (validationkey, decryptionkey и validation) для каждого сайта.

Они также имеют одинаковые настройки аутентификации, за исключением режима.Так что мой конфиг для этого выглядит следующим образом.

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" name=".ASPXFORMSAUTH" protection="All" path="/" domain="mydomain.com" enableCrossAppRedirects="true" timeout="2880" />
    </authentication>

Я думаю, что моя проблема в том, что режим «аутентификации» различен для каждого, поэтому Site2 не будет использовать куки-файл аутентификации от site1.Это всего лишь предположение.Можно ли как-нибудь выяснить проблему?

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

ОБНОВЛЕНИЕ Я проверил мой файл cookie аутентификации на Site2 после обычного входа в систему и обнаружил, что домен не былт, поэтому я удалил эту строку кода.Кроме того, я прочитал об истечении срока действия файлов cookie, когда дата не установлена, поэтому я установил дату окончания срока действия файлов cookie перед отправкой с запросом.

Итак, с этими двумя изменениями, вот где я нахожусь.

Он работает в Chrome и Firefox, но не в IE.Точно сказать не могу.Я собираюсь провести дополнительное тестирование с другого компьютера и другого пользователя, поэтому я знаю, что у меня нет остаточных файлов cookie.

1 Ответ

2 голосов
/ 26 сентября 2011

Я решил, что моей проблемой не является установка свойства Expires для моего cookie Согласно этой статье Microsoft , файлы cookie не будут записываться клиенту, если не установлено свойство Expires.

"Если вы не установите срок действия куки-файла, он будет создан, но не будет сохранен на жестком диске пользователя. Вместо этого он сохраняется как часть информации о сеансе пользователя. Когда пользователь закрывает браузер, cookie-файлы отбрасываются. Такие непостоянные cookie-файлы полезны для информации, которую необходимо хранить в течение короткого времени или которую по соображениям безопасности не следует записывать на диск на клиентском компьютере. Например, непостоянные cookie-файлы полезны если пользователь работает на общедоступном компьютере, на котором вы не хотите записывать cookie на диск. "

В этом случае мне нужно было записать cookie на диск, так как я выполнял перенос сервера на другой сайт, тем самым заканчивая сеанс для этого пользователя. Я не уверен на 100%, что это было исправлением, но сейчас оно работает, так что я предполагаю это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...