Доступ к Elmah.axd с помощью SqlErrorLog в SharePoint без добавления пользователя в базу данных - PullRequest
0 голосов
/ 15 января 2010

Я установил / настроил Elmah в моей личной среде разработчика SharePoint, и все работает отлично, так как я вошел в систему как администратор и т. Д. Я использую журнал ошибок сервера MS Sql. (Я также использую log4net для обработки журналов уровня DEBUG / INFO / etc, и операторы журналов также хранятся в БД, в той же таблице, что и ELMAH.)

Однако на реальном сервере разработки (не в моей личной среде), когда я получаю доступ к http://example/elmah.axd, я получаю ошибку «Ошибка входа в систему для пользователя« NT AUTHORITY \ ANONYMOUS LOGON »». Я понимаю, что это традиционная ошибка для «проблемы двойного прыжка», но я даже не хочу, чтобы мои учетные данные передавались - я просто хотел бы, чтобы доступ к базе данных осуществлялся с учетными данными идентификатора пула приложений. При использовании объектной модели SP доступен SPSecurity.RunWithElevatedPrivileges; однако я не хочу изменять источник Elmah.

Моя производственная среда исключает использование проверки подлинности SQL Server, изменение олицетворения на false или предоставление мне разрешений непосредственно для БД.

Как мне заставить это работать? Я что-то упустил?

1 Ответ

0 голосов
/ 15 апреля 2010

Моя производственная среда исключает использование аутентификации 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. Я проверил это сам, и это работает. Удачи.

...