セッションオブジェクトを介してユーザーを確認するためにマスターページのINITイベントに依存する非常に基本的なasp.netアプリケーションがあります。はい、私はこれが最適ではないことを知っています。
ELMAH を追加したいのですが、フォーム認証と web.config の許可/拒否設定を使用せずにコンソールを保護するための参照が見つかりません。
フォーム認証に依存しない elmah.axd ファイルを保護する別の方法はありますか?
この記事では、セッション状態へのアクセスを許可する別のイベント ハンドラーで Elmah エラー ハンドラーをラップする方法について説明します。
http://groups.google.com/group/elmah/msg/a0aa776d348ba97e
Global.asax では、次のようになります。
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
// Get the filename being requested
string filename = Path.GetFileName(Request.Path).ToLower();
// Verify that a user is logged in by checking the session
bool isValid = (HttpContext.Current.Session["User"] != null);
// Throw error if invalid
if (filename == "elmah.axd" && !isValid)
throw new SecurityException("Access to elmah.axd is denied");
}
標準の Elmah ハンドラーは IRequiresSessionState または IReadOnlySessionState を実装していないため、上記のリンクで説明されているように、これをラップする別のイベント ハンドラーを作成する必要があります。そうしないと、Application_PreRequestHandlerExecute イベントでセッションにアクセスできなくなります。
私は ELMAH の MySQL サポートの開発者の 1 人です。許可/拒否オプションは Web フォーム固有ではありません。彼らは、任意のプロバイダーと連携できます。
global.asax または独自の IHttpHandler の Request_Authentication で、IPrincipal オブジェクトを作成して Context.User オブジェクトに設定する必要があります。このようなもの:
private void Request_Authenticate (object sender, EventArgs e) {
// do checks and create IPrincipal object
IPrincipal user = new MyPrincipal(...);
Context.User = user;
}
次に、ロールが elmah.axd ハンドラーに対してチェックされると、Web フォームではなく、このカスタム オブジェクトに対して実行されます。
箱から出して、リモートアクセスは無効になっているため、ローカルマシンからのみエラーログにアクセスできます。詳細はこちら: http ://code.google.com/p/elmah/wiki/SecuringErrorLogPages