2010-01-15 7 views
0

J'ai installé/configuré Elmah sur mon environnement de développement SharePoint personnel et tout fonctionne bien depuis que je suis connecté en tant qu'administrateur, etc. J'utilise MS Sql Server Journal d'erreurs (J'utilise également log4net pour gérer la journalisation de niveau DEBUG/INFO/etc et les instructions sont également stockées dans la base de données, dans la même table que ELMAH.)Accéder à Elmah.axd avec SqlErrorLog dans SharePoint sans ajouter d'utilisateur à db

Cependant, sur le serveur de développement actuel (pas mon environnement personnel) , lorsque j'accède à http://example/elmah.axd je reçois l'erreur "Échec de la connexion pour l'utilisateur 'NT AUTHORITY \ ANONYMOUS LOGON'". Je comprends que c'est l'erreur traditionnelle pour le "problème du double saut", mais je ne veux même pas que mes informations d'identification soient transmises. Je voudrais simplement que l'accès à la base de données soit effectué avec les informations d'identification de l'application. Lors de l'utilisation du modèle d'objet SP, SPSecurity.RunWithElevatedPrivileges est disponible; Cependant, je ne veux pas modifier la source d'Elmah.

Mon environnement de production empêche l'utilisation de l'authentification SQL Server, la modification de l'emprunt d'identité sur false ou l'octroi direct d'autorisations sur la base de données.

Comment puis-je obtenir ce travail? Est-ce que je manque quelque chose?

Répondre

0

Mon environnement de production empêche l'utilisation de l'authentification SQL Server, changer l'usurpation d'identité à faux, ou me donner des autorisations sur le db directement.

Ensuite, vous n'avez pas d'autre choix que de modifier la source Elmah. Pardon.

Cela a moins à voir avec le problème du double bond et plus avec le mécanisme d'usurpation d'identité mal documenté dans ASP.NET. Selon this article, apparemment <identity impersonate="true" /> provoque ASP.NET pour emprunter l'identité du compte IIS anonyme par défaut (IUSR_ machinename). SharePoint a besoin de cela, mais cela ne sert à rien d'essayer d'accéder à une base de données distante, donc il y a évidemment quelque chose que vous devez faire. Oui, selon this article Vous devez éditer le code source d'Elmah et créer une nouvelle classe dérivant de la classe abstraite ErrorLog. Cette nouvelle classe agit alors comme un wrapper autour de la classe SqlErrorLog d'origine et exécute ses méthodes dans un bloc RWEP. Ici, il est:

public class SqlErrorLogWEP : ErrorLog 
{ 
    private SqlErrorLog sqlErrorLog; 

    public SqlErrorLogWEP(IDictionary config) 
    { 
     sqlErrorLog = new SqlErrorLog(config); 
    } 

    public SqlErrorLogWEP(string connectionString) 
    { 
     sqlErrorLog = new SqlErrorLog(connectionString); 
    } 

    public override string Log(Error error) 
    { 
     string retVal = String.Empty; 
     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      retVal = sqlErrorLog.Log(error); 
     }); 

     return retVal; 
    } 

    public override ErrorLogEntry GetError(string id) 
    { 
     ErrorLogEntry retVal = default(ErrorLogEntry); 

     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      retVal = sqlErrorLog.GetError(id); 
     }); 

     return retVal; 
    } 

    public override int GetErrors(int pageIndex, int pageSize, System.Collections.IList errorEntryList) 
    { 
     int retVal = -1; 

     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      retVal = sqlErrorLog.GetErrors(pageIndex, pageSize, errorEntryList); 
     }); 

     return retVal; 
    } 
} 

Il va sans dire que vous devez maintenant faire référence à SharePoint dans le projet Elmah et votre Elmah.dll devrez être GACed. J'ai testé cela moi-même et ça fonctionne. Bonne chance.

+1

J'ai fini par éditer la source d'Elmah - pas aussi élégante que votre solution cependant. J'ai juste enveloppé les appels db dans "RunWithElevatedPrivileges" et bien sûr mis l'assemblée dans le GAC, etc. Merci! – Chloraphil