Аудит идентификации пользователя в .NET - Какая хорошая стратегия?
Вопрос
Я уверен, что с этим требованием многие разработчики сталкивались раньше:бизнесу нужен журнал аудита, чтобы знать, кто выполняет действия в их системе.
Независимо от того, как вы решите хранить проверенную информацию, суть этой проблемы заключается в том, как идентифицировать текущего пользователя.
Я хочу написать компоненты, начиная от небольших классов модели предметной области и заканчивая сервисными компонентами, все из которых можно безопасно вызывать из любого из следующих хост-приложений:
- Настольное приложение для Windows.
- ASP.NET Веб-сайт, размещенный в IIS.
- Служба WCF, размещенная в IIS.
- Служба WCF, размещенная в службе Windows.
Учитывая диапазон технологий, различные модели аутентификации и необходимость учитывать концепцию "анонимного" пользователя, мне неясна стратегия, которую следует использовать, чтобы централизованно установить личность того, кто вызвал мой компонент.
Может ли кто-нибудь из вас, умных людей, предложить подход к решению этой проблемы?
Решение
Обычно я бы потребовал, чтобы приложения устанавливали Thread.CurrentPrincipal
участнику, идентификатор которого представляет текущего пользователя.Это можно сделать при запуске приложения (с помощью WindowsIdentity.GetCurrent()) в клиентском приложении (WinForms или консоли) из HttpContext.Current.Пользователь или роли.getCurrentUser() в приложении ASP.NET или WCF, размещенном в IIS, и т.д.
Затем в компонентах более низкого уровня вы просто используете Thread.CurrentPrincipal.Identity
для одитинга.
Редактировать
(В ответ на комментарий) - обратите внимание, что Thread.CurrentPrincipal.Identity
не имеет ничего общего с контекстом безопасности потока:это представлено WindowsIdentity и может быть извлечено с помощью WindowsIdentity.GetCurrent
и изменен с помощью WindowsIdentity.Impersonate
.
Другие советы
Наилучший подход, использующий самые современные методы, вероятно, заключается в использовании Основа идентификации Windows.
WIF предназначен для решения проблем с идентификацией пользователей в различных технологиях с использованием .NET.