2010-09-29 3 views
4

Мне нужно захватить сертификаты пользователя X.509 с их карт и сопоставить их с таблицей пользователя для проверки подлинности форм в ASP.NET MVC. Я создал проект MVC (ver 2) в VS 2008, настроенный для запуска в качестве виртуального каталога под веб-сайтом по умолчанию в локальном IIS в Vista с использованием шаблона по умолчанию, но добавленный RequireHttpsAttribute к Action/LogOn ActionResult. Никаких других изменений. Используя локальный диспетчер IIS, я создал самозаверяющий сертификат и применил его, а затем задал страницу Account/Logon.aspx Требовать SSL и Требовать сертификаты клиентов.ASP.NET MVC 2 и запрос сертификата клиента (проверка подлинности с помощью смарт-карты)

Выполнение отладки, когда я нажимаю ссылку «Вход» на странице приветствия (Главная/Индекс), она правильно маршрутизируется в Account/Logon.aspx, используя https, но не запрашивает сертификат. Используя Dynatrace (awesome, http://ajax.dynatrace.com), я вижу, что статус ответа получает значение 403, но опять же, нет приглашения на сертификат.

В качестве проверки на работоспособность я установил проект веб-приложения asp.net по умолчанию для запуска в виртуальном каталоге на веб-сайте по умолчанию (аналогично проекту MVC выше) в Vista и настроил страницу default.aspx для запроса SSL и Требовать клиентские сертификаты, как это сделано в проекте MVC выше. Заверши его, отлично работает, я получаю приглашение сертификата и могу выбрать сертификат и ввести PIN-код для карты и прочитать мой X.509 из объекта request.clientcertificate в коде позади.

Пул приложений для обоих виртуальных каталогов установлен в Classic .NET AppPool в интегрированном режиме конвейера.

Помогите ?!

Обновление: Обходной путь обхода крупным планом. Я добавил в файл папки «Auth» и «GetCert.aspx», который помечает сертификаты SSL/Требование клиента к проекту MVC, а затем добавил «routes.IgnoreRoute» («Auth/{* pathInfo)») в глобальную .asax. Кодовое имя GetCert.aspx response.writes данные, которые я хочу получить от X.509. Затем я добавил вызов jquery.get в LogOn.aspx, который вызывает GetCert.aspx, и возвращает результаты cert Subject в виде строки в div в LogOn.aspx. Теперь я получаю приглашение cert и получаю результаты в моем представлении MVC, но это не может быть способ сделать это!

ответ

2

У меня есть рабочее решение с использованием проверки подлинности форм и атрибута authorize в моем базовом классе контроллера, поэтому все запросы, не прошедшие проверку подлинности, переходят в Account/LogOn. Кнопка отправки страницы logOn маршрутизируется в действие с именем Authorize, которое украшено атрибутом RequireHttps, который корректно запускает приглашение для сертификата клиента. Как только сертификат выбран, действие Authorize обрабатывает синтаксический анализ HttpClientCertificate для информации пользователя, которую я хочу, и выполняет поиск соответствия в таблице моих пользователей и записывает файл cookie для проверки подлинности. Затем у меня есть HttpModule, который читает cookie для создания пользовательского принципала в событии AuthenticateRequest. Все это прекрасно работает. Я открываю еще один вопрос для следующего вопроса относительно конфигурации IIS «игнорировать клиентские сертификаты» здесь: https://stackoverflow.com/questions/4141272/iis-6-ssl-client-certificates-configuration

+0

может быть кому-то полезен: http://stackoverflow.com/questions/7825305/secure-asp-net-mvc -приложение-с-ssl-и-client-сертификат-аутентификация и http://www.iis.net/ConfigReference/system.webServer/security/authentication/iisClientCertificateMappingAuthentication – quetzalcoatl