2010-05-25 18 views
2

En utilisant une approche basée sur les déclencheurs pour la journalisation d'audit, j'enregistre l'historique des modifications apportées aux tables dans la base de données. L'approche que j'utilise (avec une connexion SQL statique au serveur) pour enregistrer quel utilisateur a effectué la modification implique l'exécution d'une procédure stockée au début de chaque connexion à la base de données. Les déclencheurs utilisent ce nom d'utilisateur lors de l'enregistrement des lignes d'audit. (Les déclencheurs sont fournis par le produit OmniAudit.)Comment vérifier les tables d'adhésion ASP.NET, tout en enregistrant quel utilisateur a effectué les modifications?

Toutefois, les tables d'adhésion ASP.NET sont principalement accessibles via l'API Membership. Je dois transmettre l'identité de l'utilisateur actuel lorsque l'API Membership ouvre sa connexion à la base de données. J'ai essayé de sous-classer MembershipProvider mais je ne peux pas accéder à la connexion de base de données sous-jacente.

Il semble que ce serait un problème commun. Est-ce que quelqu'un sait des crochets que nous pouvons accéder quand l'adhésion d'ASP.NET fait sa connexion de base de données?

Répondre

1

Mise à jour 2: n'a pas l'air sur le front AOP, je crains - voir Is is possible to intercept a static method on an object you don't own and did not create?

Et comme évoqué dans les commentaires, il semble que le meilleur pari est d'utiliser la mise en œuvre de la boîte à outils du fournisseur du J'utilise le code du toolkit, que j'ai nettoyé considérablement, de manière fiable pendant des années sans problèmes. Permettez-moi de confirmer sur 4.0 et le paquet si vous êtes intéressé.


Mise à jour:

Ok, je pense que je comprends mieux votre besoin, dites-moi si je me trompe:

Vous avez besoin de la connexion réelle qui est utilisé par le fournisseur?

SqlMembershipProvider utilise une classe d'assistance, System.Web.DataAccess.SqlConnectionHolder, pour tous ses accès aux données. Je n'ai pas fait cela, mais d'après ce que j'ai pu comprendre, vous pouvez intercepter des appels pour construire cet objet en utilisant une implémentation AOP telle que Castle DynamicProxy (ou l'une des bibliothèques qui l'utilisent) et obtenir votre connexion.

Quelqu'un avec plus d'expérience pourrait confirmer ou infirmer cela?


réponse originale:

Pas besoin de tirer de SqlMembershipProvider. Entrez et obtenez ce dont vous avez besoin.

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

Merci, idée très intéressante. Je pensais qu'une approche AOP est logique. Je ne suis pas sûr de vouloir introduire une autre dépendance sur quelque chose comme Castle en ce moment. En ce moment je considère employer la source pour SqlMembershipProvider, que je viens de découvrir est disponible. Une de mes préoccupations est que ce code source date de 2006, et je ne sais pas s'il a été mis à jour avec les versions subséquentes d'asp.net. – Pete

+0

En fait, j'ai une autre question en ce qui concerne AOP et il ne semble pas bon pour nous .. http://stackoverflow.com/questions/2912300/is-possible-to-intercept-a-constructor-on-a- class-you-do-not-own, mais - ma suggestion suivante était d'utiliser un fournisseur personnalisé basé sur les exemples de la boîte à outils. J'ai affiné ce code un peu au fil des ans et ça fonctionne comme un charme. Rien n'a été changé qui affecte la pertinence de ce code.Si vous pouvez attendre quelques jours je vais rendre mon travail disponible. –

+0

@Pete - ping ... désolé, n'a pas @ vous-voir la mise à jour. –