0

個人の SharePoint 開発環境にElmahをインストール/構成しましたが、管理者としてログインしているため、すべてがうまく機能しています。MS Sql サーバー エラー ログを使用しています。( DEBUG/INFO/etc レベルのロギングを処理するためにlog4netも使用しており、ログ ステートメントも ELMAH と同じテーブルの db に格納されています。)

ただし、実際の開発サーバー (私の個人環境ではない) でhttp://example/elmah.axdにアクセスすると、「ユーザー 'NT AUTHORITY\ANONYMOUS LOGON' のログインに失敗しました」というエラーが表示されます。これが「ダブルホップの問題」の従来のエラーであることは理解していますが、資格情報を渡されることさえ望んでいません。アプリケーション プール ID の資格情報を使用してデータベース アクセスを行いたいだけです。SP オブジェクト モデルを使用する場合、SPSecurity.RunWithElevatedPrivileges を使用できます。ただし、Elmah ソースを変更したくありません。

私の運用環境では、SQL Server 認証の使用を排除し、偽装を false に変更するか、自分自身にデータベースに対する権限を直接与えています。

どうすればこれを機能させることができますか? 何か不足していますか?

4

1 に答える 1

0

私の運用環境では、SQL Server 認証の使用を排除し、偽装を false に変更したり、自分自身にデータベースに対する権限を直接付与したりしています。

そうなると、Elmah ソースを変更するしかありません。ごめん。

これは、ダブル ホップの問題とはあまり関係がなく、ASP.NET で文書化されていない偽装メカニズムと関係があります。この記事によると、 <identity impersonate="true" />ASP.NET がデフォルトの IIS 匿名アカウント (IUSR_ machinename ) になりすますようです。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;
    }
}

言うまでもなく、Elmah プロジェクトで SharePoint を参照する必要があり、Elmah.dll を GAC する必要があります。私はこれを自分でテストしましたが、動作します。幸運を。

于 2010-04-15T15:10:51.350 に答える