Является ли аутентификация форм аутентификацией билетов с помощью PHP?

Я разработчик PHP, который почти ничего не знает о .NET. Меня попросили ребята .NET на работе перевести .NET-код, который расшифровывает аутентификационный билет на PHP, чтобы PHP-код мог установить соответствующие переменные сеанса для моего приложения. Возможно ли это? Я смотрю на код, и это меня озадачивает. Я буду продолжать пытаться, если кто-то скажет мне, что это не пустая трата времени по какой-то причине, о которой я даже не знаю. Спасибо за любую помощь!

Дополнительная информация: Можно ли даже захватить билет с помощью PHP в первую очередь?

Как сказал Гумбо, вам нужно учитывать задействованные алгоритмы. Билет проверки asp.net использует:

  1. Создайте билет проверки подлинности с использованием серийной формы. Создается представление байтового массива билета.
  2. Подпишите билет проверки подлинности форм. Значение кода аутентификации сообщения (MAC) для байтового массива вычисляется с использованием алгоритма и ключа, определяемых атрибутами validation и validationKey элемента machineKey. По умолчанию используется алгоритм SHA1.
  3. Шифрование билета проверки подлинности. Второй массив байтов, который был создан, зашифрован с использованием метода Encrypt класса FormsAuthentication. Метод Encrypt внутренне использует алгоритм и ключ, указанные атрибутами дешифрования и дешифрованияKey элемента machineKey. ASP.NET версии 1.1 использует алгоритм 3DES по умолчанию. ASP.NET версии 2.0 использует алгоритм Rinjdael (AES) по умолчанию.

Во-первых, откройте файл machine.config и добавьте запись machinekey. Установите ключ дешифрования и ключ проверки в соответствии с произвольно сгенерированными из генератора машинных клавиш для aspnet 2.0.

Обязательно используйте настройки по умолчанию, т.е. AES и SHA1. Теперь, когда у вас есть ключ расшифровки AES, сохраните его где-нибудь, потому что вам понадобится его на стороне php. В вашем сетевом приложении dot перейдите в файл web.config и получите имя файла cookie auth, как правило, что-то вроде .ASPXAUTH

Теперь перейдите на сторону PHP. Загрузите и настройте библиотеку шифрования AES, подобную этой, http://phpseclib.sourceforge.net/documentation/

Затем в PHP вы можете сделать что-то вроде этого (это использует phpsec lib):

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); include('Crypt/AES.php'); $authCookie = $_COOKIE['_ASPXAUTH']; echo $authCookie; $aes = new Crypt_AES(); $aes->setKey('BCDCBE123654F3E365C24E0498346EB95226A307857B9BDE8EBA6198ACF7F03C'); echo $aes->decrypt($authCookie); 

Теперь то, что в итоге выходит, будет состоять в том, чтобы сначала PM + SHA1 hash + байтовое представление билета auth. Вы должны преобразовать сериализованные байты в строку, чтобы сделать ее читаемой. Может ли кто-нибудь добавить на этом последнем этапе?

Из Microsoft KB

Билет проверки подлинности форм используется для указания приложения ASP.NET, которым вы являетесь. Таким образом, билет является строительным блоком безопасности аутентификации Forms.

Билет зашифрован и подписан с использованием элемента конфигурации файла Machine.config сервера. ASP.NET 2.0 использует decryptionKey и новый атрибут дешифрования элемента для шифрования билетов проверки подлинности. Атрибут дешифрования позволяет указать алгоритм шифрования. ASP.NET 1.1 и 1.0 используют шифрование 3DES, которое не настраивается. Вмешательство с значением билета определяется неспособностью расшифровать билет на сервере. В результате пользователь будет перенаправлен на страницу входа в систему.

Если приложение развернуто в веб-ферме, вы должны убедиться, что файлы конфигурации на каждом сервере имеют одинаковое значение для атрибутов validationKey и decryptionKey в теге, которые используются для хэширования и дешифрования билета соответственно. Вы должны сделать это, потому что вы не можете гарантировать, какой сервер будет обрабатывать последовательные запросы. Для получения дополнительной информации о процедурах шифрования FormsAuthenticationTicket и развертывания веб-фермы посетите следующий веб-узел MSDN:

Таким образом, вы можете указать, какой алгоритм шифрования / дешифрования следует и ключ. Вы можете использовать одну и ту же логику дешифрования в PHP.

Если вы знаете алгоритм дешифрования, вы можете реализовать его на PHP.