Нахождение имени пользователя при подключении к Entity Framework

Необходимо узнавать имя пользователя запускающего программу и работающего с базой данных для занесения информации о нем в базу при добавлении данных. Узнаю его имя через команду Environment.UserName. Но если человек работает с личного компьютера подключенного к сети через VPN доступ к базе он имеет как доменный пользователь, но Environment.UserName показывает его имя на личном компьютере. Может кто знает как узнать доменное имя по которому он подключен к базе?


Ответы (1 шт):

Автор решения: Pavel Mayorov

Для начала, никогда не верьте клиенту! Забудьте, что вы в принципе можете на клиенте как-то узнать имя пользователя и передать его в БД. Вам не следовало даже думать, что Environment.UserName может означать что-то полезное в плане базы данных.

Если пользователь может подключиться к БД под доменной "учёткой" - значит, вы скорее всего используете MS SQL Server и вы можете использовать CURRENT_USER в качестве его имени:

SELECT CURRENT_USER;

Дальше, нужно этот CURRENT_USER как-то вставить в запрос. Самый простой (но совершенно небезопасный!) способ - это добавить его значением по умолчанию:

ALTER TABLE foo ADD CONSTRAINT DF_CreatedBy DEFAULT CURRENT_USER FOR [createdBy]

В таком случае эту колонку в EF вам придётся пометить как вычислимую (Computed), чтобы она не затиралась при вставке. Но это абсолютно небезопасное решение!


Правильный способ обеспечения безопасности в двухзвенной архитектуре - хранимые процедуры и триггеры.

В варианте с хранимыми процедурами вы полностью запрещаете пользователям менять содержимое таблиц напрямую, и вместо этого пишете хранимую процедуру на каждую операцию.

Вариант с триггерами чуть попроще, тут вы просто навешиваете триггер на таблицу:

CREATE TRIGGER fooInserted ON foo FOR INSERT AS
BEGIN

    UPDATE foo
    SET createdBy = CURRENT_USER, modifiedBy = CURRENT_USER
    WHERE id IN (SELECT id FROM inserted)

END

CREATE TRIGGER fooUpdated ON foo FOR UPDATE AS
BEGIN

    UPDATE foo
    SET modifiedBy = CURRENT_USER
    WHERE id IN (SELECT id FROM inserted)

END
→ Ссылка