Моя производственная среда исключает
использование аутентификации SQL Server,
изменение подражания на ложное или
давая себе разрешения на БД
непосредственно.
Тогда у вас нет выбора, кроме как изменить источник Эльмы. К сожалению.
Это связано не столько с проблемой двойного прыжка, сколько с плохо документированным механизмом олицетворения в ASP.NET. Согласно этой статье , очевидно, <identity impersonate="true" />
заставляет ASP.NET выдавать себя за анонимную учетную запись IIS по умолчанию (IUSR_ имя_машины ). SharePoint нуждается в этом, но бесполезно пытаться получить доступ к удаленной базе данных, поэтому вам, безусловно, нужно кое-что сделать.
Да, согласно этой статье вы должны отредактировать исходный код Elmah и создать новый класс, производный от абстрактного класса ErrorLog
. Этот новый класс затем действует как обертка вокруг исходного класса SqlErrorLog и запускает его методы в блоке RWEP. Вот оно:
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;
}
}
Само собой разумеется, что теперь вам нужно будет ссылаться на SharePoint в проекте Elmah, и ваш Elmah.dll должен быть GACed. Я проверил это сам, и это работает. Удачи.