Нахождение имени пользователя при подключении к Entity Framework
Необходимо узнавать имя пользователя запускающего программу и работающего с базой данных для занесения информации о нем в базу при добавлении данных. Узнаю его имя через команду Environment.UserName. Но если человек работает с личного компьютера подключенного к сети через VPN доступ к базе он имеет как доменный пользователь, но Environment.UserName показывает его имя на личном компьютере. Может кто знает как узнать доменное имя по которому он подключен к базе?
Ответы (1 шт):
Для начала, никогда не верьте клиенту! Забудьте, что вы в принципе можете на клиенте как-то узнать имя пользователя и передать его в БД. Вам не следовало даже думать, что 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