Это интересный вопрос, который вы задали. Я знаю, что по какой-то причине Microsoft выпустила эту платформу Windows Identity Foundation без особой документации. Я знаю это, потому что мне было поручено выяснить, как использовать его в новом проекте и интегрировать в существующую инфраструктуру. Я искал в Интернете в течение нескольких месяцев в поисках полезной информации.
Я принял несколько иной подход к решению проблемы, которую вы описываете.
Я взял существующее приложение для входа и интегрировал в него WIF-систему Microsoft. Под этим я подразумеваю, что у меня есть приложение, в которое входит пользователь. Приложение для входа передает учетные данные, предоставленные пользователем, на другой сервер, который возвращает идентификатор пользователя (или указывает на ошибку входа в систему).
Глядя на некоторые примеры Microsoft, я вижу, что они делают следующее:
Создайте SignInRequestMessage
из строки запроса (созданной приложением проверяющей стороны), создайте службу маркеров безопасности из пользовательского класса и, наконец, вызовите FederatedSecurityTokenServiceOperations.ProcessSignInresponse с текущим httpcontext.response. К сожалению, я не могу объяснить это хорошо здесь; вам действительно нужно взглянуть на примеры кода.
Часть моего кода очень похожа на пример кода. Где вы будете заинтересованы в реализации большей части вашей собственной логики - в GetOutputClaimsIdentity
. Это функция, которая создает идентификатор заявок, который описывает вошедшего в систему пользователя.
Теперь вот что, я думаю, вы действительно хотите знать. Это то, что Microsoft не сообщает вам в своей документации, AFAIK.
Когда пользователь входит в систему, он перенаправляется обратно в приложение проверяющей стороны. Независимо от того, как работает приложение для входа в систему, классы WIF отправят в браузер пользователя ответ, содержащий «скрытый» HTML-ввод, содержащий сертификат подписи токена и утверждения пользователя. (Претензии будут в открытом тексте). В конце этого ответа происходит перенаправление на ваш сайт проверяющей стороны. Я знаю об этом действии только потому, что запечатлел его с помощью «Скрипача»
Вернувшись на веб-сайт проверяющей стороны, классы WIF будут обрабатывать ответ (до запуска любого вашего кода). Сертификат будет подтвержден. По умолчанию, если вы настроили веб-сайт проверяющей стороны с помощью FedUtil.exe (нажав «Добавить ссылку на STS в приложении проверяющей стороны из Visual Studio), класс Microsoft проверит отпечаток сертификата.
Наконец, инфраструктура WIF устанавливает файлы cookie в браузере пользователя (по моему опыту имена файлов cookie начинаются с «FedAuth»), которые содержат утверждения пользователей. Печенье не читается человеком.
Как только это произойдет, вы можете по желанию выполнить операции с претензиями пользователя на веб-сайте проверяющей стороны, используя ClaimsAuthenticationClass
. Здесь ваш код снова выполняется.
Я знаю, что это отличается от того, что вы описываете, но у меня эта настройка работает. Надеюсь, это поможет!
пс. Пожалуйста, ознакомьтесь с другими вопросами, которые я задавал о Windows Identity Foundation.
ОБНОВЛЕНИЕ: Чтобы ответить на вопрос в комментариях ниже:
Одна вещь, которую я упустил, заключается в том, что перенаправление в приложение входа в систему STS происходит путем перенаправления со строкой запроса, содержащей URL-адрес приложения, в которое входит пользователь. Это перенаправление происходит автоматически при первом обращении пользователя к странице, требующей аутентификации. Кроме того, я считаю, что вы можете сделать перенаправление вручную с помощью модуля WSFederationAuthentication
.
Я никогда не пытался сделать это, но если вы хотите использовать страницу входа в самом приложении, я считаю, что фреймворк должен позволить вам использовать следующее:
1) Инкапсулируйте ваш код STS в библиотеке.
2) Ссылка на библиотеку из вашего приложения.
3) Создайте страницу входа в свое приложение. Убедитесь, что такая страница не требует аутентификации.4) Задайте для свойства входа элемента wsFederation
в разделе Microsoft.IdentityModel
вашего web.config страницу входа.