ユーザーをデータベースに追加せずに SharePoint で SqlErrorLog を使用して Elmah.axd にアクセスする
-
20-09-2019 - |
質問
インストール/設定しました エルマ 私の個人的な SharePoint 開発環境では、管理者としてログインしているため、すべてがうまく機能します。MS SQL Server エラー ログを使用しています。(私も使っています ログフォーネット DEBUG/INFO/etc レベルのログを処理するため、ログ ステートメントも ELMAH と同じテーブルのデータベースに保存されます。)
ただし、実際の開発サーバー(私の個人環境ではありません)では、アクセスすると http://example/elmah.axd 「ユーザー 'NT AUTHORITY\ANONYMOUS Logon' のログインに失敗しました」というエラーが表示されます。これが「ダブルホップ問題」による従来のエラーであることは理解していますが、自分の資格情報も渡されたくないのです。アプリケーション プール ID の資格情報を使用してデータベースにアクセスしたいだけです。SP オブジェクト モデルを使用する場合は、SPSecurity.RunWithElevatedPrivileges を使用できます。ただし、Elmah ソースは変更したくありません。
私の運用環境では、SQL Server 認証の使用、偽装を false に変更すること、またはデータベースに対するアクセス許可を自分に直接与えることはできません。
どうすればこれを機能させることができますか?何かが足りないのでしょうか?
解決
私の生産環境は、SQL Server認証の使用、なりすましの変更の変更、またはDBの権限を直接提供することを妨げています。
その場合は、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;
}
}
言うまでもなく、Elmah プロジェクトで SharePoint を参照する必要があり、Elmah.dll を GAC する必要があります。私はこれを自分でテストしましたが、うまくいきました。幸運を。