Как войти в базу данных пользователя Windows, а не учетной записи службы? - PullRequest
3 голосов
/ 31 января 2012

В нашей интрасети запущено веб-приложение .NET 4.Когда пользователь запускает приложение, кредиты пользователя Windows проверяются, чтобы убедиться, что он входит в правильные группы Active Directory.Если все идет хорошо, пользователь отправляется на нашу страницу приложения, и он может начать работать.

Веб-приложение подключается к базе данных через универсальную учетную запись службы (учетную запись с ограниченными возможностями для ведения дел в качестве универсального пользователя).).Система работает отлично.Изменения пользователя регистрируются.

Проблема в том, что имя пользователя регистрируется.Зарегистрированное имя пользователя - это имя учетной записи службы, а не имя пользователя.Как вы можете себе представить, это делает аудит совершенно бесполезным.Да, мы можем сказать, что было внесено изменение, и когда оно было внесено, и даже что это было за изменение, но мы не можем сказать, кто это сделал.

Некоторая справка.время, построенное на SQL Server 2005. В то время ведущий разработчик пришел к выводу, что невозможно передать имя пользователя Windows в базу данных и заставить его правильно зарегистрировать имя пользователя.Было принято решение «жить с этим» и пересмотреть, когда мы перешли на SQL Server 2008.

Итак, мы сейчас находимся на SQL Server 2008, и я переоцениваю.Ведущего разработчика больше нет.

Как мне продолжать использовать мою служебную учетную запись, но регистрировать имя учетной записи Windows?Мы не хотим создавать учетные записи SQL для каждого пользователя.

ОБНОВЛЕНИЕ 1 - я пропустил критическую деталь.Все генерируемые нами журналы изменений основаны на триггере.Записи аудита генерируются базой данных с помощью триггеров при каждом изменении, а не с помощью кода SQL в веб-приложении.

Ответы [ 2 ]

0 голосов
/ 31 января 2012

В зависимости от того, как ваше приложение поддерживает соединения с БД, вы можете передавать имя пользователя в CONTEXT_INFO SQL Server при каждом подключении к БД из вашего приложения.

-- Set a username in CONTEXT_INFO after each connection to the DB:
declare @context_info varbinary(128) = cast(N'username' as varbinary(128))
set context_info @context_info

-- Grab this info at any time in your sql procs:
select cast(context_info() as nvarchar(64)) as CONTEXT_INFO

ОБНОВЛЕНИЕ : я изменил это для использования nvarchar, а также показываю только предпочтительный метод Microsoft для извлечения CONTEXT_INFO (функция context_info ()).Системные представления кажутся устаревшими при определенных условиях.

0 голосов
/ 31 января 2012

Вам нужно будет сделать это с помощью кода в вашей внутренней сети.Поскольку ASP.Net работает в своем собственном контексте процесса w3worker, он всегда будет отображаться в качестве этой учетной записи на сервере SQL.

Используйте либо Page.User.Identity.Name, либо более полное имя System.Web.HttpContext.Current.User.Identity.Name.

Получите имя пользователя, обращающегося к ASPСтраница внутренней сети .NET в локальной сети

...