Domanda

Ho installato / configurato Elmah sul mio ambiente SharePoint dev personali e tutto funziona alla grande dal ho effettuato l'accesso come amministratore, ecc sto usando l'Errore del server MS SQL Log. (Sono anche utilizzando log4net per gestire DEBUG / INFO / Livello di registrazione etc e registrare le dichiarazioni sono memorizzati anche in il db, nella stessa tabella come ELMAH di.)

Tuttavia, sul server dev reale (non il mio ambiente personale), quando accedo http: // esempio / ELMAH. AXD ottengo l'errore "Accesso non riuscito per l'utente 'NT AUTHORITY \ ANONYMOUS accesso'". Capisco che questo è l'errore tradizionale per il "problema del doppio hop", ma io non voglio nemmeno le mie credenziali da passare insieme - vorrei solo come l'accesso al database da effettuare con le credenziali del pool di applicazioni. Quando si utilizza il modello a oggetti SP lo SPSecurity.RunWithElevatedPrivileges è disponibile; tuttavia, non voglio modificare la fonte Elmah.

Il mio ambiente di produzione preclude l'uso di autenticazione di SQL Server, cambiando la rappresentazione a falsi, o darmi le autorizzazioni sul db direttamente.

Come posso ottenere questo lavoro? Mi sto perdendo qualcosa?

È stato utile?

Soluzione

  

Il mio ambiente di produzione osta   l'uso di autenticazione di SQL Server,   cambiando la rappresentazione su false, o   darmi autorizzazioni per il db   direttamente.

Quindi non hai scelta, ma per modificare la fonte Elmah. Siamo spiacenti.

Questo ha meno a che fare con il problema doppio hop e più a che fare con il meccanismo scarsamente documentati di rappresentazione in ASP.NET. Secondo questo articolo , a quanto pare <identity impersonate="true" /> provoca ASP.NET di impersonare il predefinito IIS account anonimo (IUSR_ machinename ). SharePoint ha bisogno di questo, ma lo fa nulla di buono cercando di accedere a un database remoto, in modo c'è ovviamente qualcosa che devi fare.

Sì, in base al questo articolo è necessario modificare il codice sorgente Elmah e creare una nuova classe derivata dalla classe ErrorLog astratta. Questa nuova classe agisce quindi come un wrapper per la classe SqlErrorLog originale e gestisce i suoi metodi in un blocco RWEP. Eccolo:

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;
    }
}

E 'ovvio che sarà ora necessario fare riferimento SharePoint nel progetto Elmah e la vostra Elmah.dll avrete bisogno di essere GACed. Ho provato io stesso e funziona. Buona fortuna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top