Accesso Elmah.axd con SqlErrorLog in SharePoint senza l'aggiunta di utenti a DB
-
20-09-2019 - |
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?
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.