Доступ к Elmah.axd с помощью SqlErrorLog в SharePoint без добавления пользователя в базу данных
-
20-09-2019 - |
Вопрос
Я установил / настроил Эльма в моей личной среде разработки SharePoint все работает отлично, так как я вошел в систему как администратор и т.д.Я использую журнал ошибок MS Sql Server.(Я также использую log4net для обработки ведения журнала на уровне DEBUG / INFO / etc инструкции log также хранятся в базе данных, в той же таблице, что и у ELMAH.)
Однако на самом сервере разработки (не в моей личной среде), когда я получаю доступ http://example/elmah.axd Я получаю сообщение об ошибке "Не удалось войти в систему для пользователя 'NT AUTHORITY\ АНОНИМНЫЙ ВХОД в СИСТЕМУ'".Я понимаю, что это традиционная ошибка для "проблемы с двойным переходом", но я даже не хочу, чтобы передавались мои учетные данные - я бы просто хотел, чтобы доступ к базе данных осуществлялся с учетными данными идентификатора пула приложений.При использовании объектной модели SP доступна функция SPSecurity.RunWithElevatedPrivileges;однако я не хочу изменять исходный код Elmah.
Моя производственная среда исключает использование аутентификации SQL Server, изменение олицетворения на false или предоставление мне прав доступа к базе данных напрямую.
Как я могу заставить это сработать?Я что-то упускаю?
Решение
Моя производственная среда исключает использование аутентификации SQL Server, изменение олицетворения на false или предоставление мне прав доступа к базе данных напрямую.
Тогда у вас нет другого выбора, кроме как изменить источник Elmah.Извините.
Это связано не столько с проблемой двойного перехода, сколько с плохо документированным механизмом олицетворения в 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 должна быть настроена.Я сам это проверил, и это работает.Удачи.