Как бы вы провели аудит таблиц членства ASP.NET, записывая, какой пользователь внес изменения? - PullRequest
2 голосов
/ 25 мая 2010

Используя основанный на триггерах подход к ведению журнала аудита, я записываю историю изменений, внесенных в таблицы в базе данных. Подход, который я использую (со статическим именем входа на сервер sql) для записи того, какой пользователь внес изменение, включает запуск хранимой процедуры в начале каждого соединения с базой данных. Триггеры используют это имя пользователя при записи строк аудита. (Триггеры предоставляются продуктом OmniAudit.)

Однако доступ к таблицам членства ASP.NET осуществляется главным образом через API членства. Мне нужно передать идентификатор текущего пользователя, когда API-интерфейс Membership открывает соединение с базой данных. Я попытался создать подклассы MembershipProvider, но не могу получить доступ к подключению к базе данных.

Кажется, это будет распространенной проблемой. Кто-нибудь знает о каких-либо хуках, к которым мы можем получить доступ, когда членство в ASP.NET устанавливает соединение с базой данных?

1 Ответ

1 голос
/ 26 мая 2010

Обновление 2: Боюсь, что на внешнем виде АОП выглядит не очень хорошо - см. Возможно ли перехватить статический метод для объекта, которым вы не владеете и не создали?

И, как упоминалось в комментариях, похоже, что лучше всего использовать реализацию провайдеров Provider Toolkit и подключить свой хук к SqlConnectionHelper.GetConnection()

Я использую код инструментария, который я значительно очистил, надежно годами без проблем. Позвольте мне подтвердить на 4.0 и упаковать его, если вы заинтересованы.


Обновление:

Хорошо, я думаю, что лучше понимаю вашу потребность, скажите мне, если я прав:

Вам нужно фактическое соединение, используемое провайдером?

SqlMembershipProvider использует вспомогательный класс System.Web.DataAccess.SqlConnectionHolder для всего доступа к данным.

Я этого не делал, но из того, что я понял, вы могли перехватывать вызовы для создания этого объекта, используя реализацию AOP, такую ​​как Castle DynamicProxy (или одна из библиотек, которая его использует), и получать ваше соединение там.

Может ли кто-нибудь с большим опытом подтвердить или опровергнуть это?


Оригинальный ответ:

Нет необходимости выводить из SqlMembershipProvider. Просто зайдите и получите то, что вам нужно.

string connectionString = 
   typeof(SqlMembershipProvider)
   .GetField("_sqlConnectionString",BindingFlags.NonPublic | BindingFlags.Instance)
   .GetValue(Membership.Provider);
...