3

統合モードの IIS 7.5 で実行される .NET 4.0、ASP.NET MVC 3 イントラネット アプリケーションを構築しています。Windows 認証は、Web サイトへのアクセスを制御するために使用されます。Windows 認証モジュールが有効になり、他のすべての認証モジュールが無効になります。

現在、ユーザーが不適切な資格情報を提供すると、Windows 認証モジュールは資格情報を正しく拒否し、ログイン プロンプトを再表示します。これが 3 回行われた後、標準の .NET 401 Unauthorized Access ページが表示されます。これは予想され、望ましいことです。

私の目標:失敗した認証試行の詳細を独自のカスタム イベント ログに記録できるようにしたいと考えています。特に、ログイン試行で使用されたユーザー名をキャプチャします。(セキュリティ上の理由から、パスワードを取得することはおそらく不可能であることを認めます。)

私の目標は可能ですか?

私はすでに動作する IHttpModule モジュールを構築し、次のようにイベント ハンドラーとしてWindowsAuthenticationModuleに追加しました。

myWindowsAuthenticationModule.Authenticate += WindowsAuthentication_Authenticate;

しかし、ログイン試行が失敗した場合、おそらく WindowsAuthenticationModule がログインが失敗したとすでに判断しているため、私のモジュールを呼び出す意味がないため、私のコードは呼び出されません。私のモジュール、ログイン試行が成功した後に呼び出されるため、イベント ハンドラーが適切に設定されていることは確かです。

私の知る限りでは、WindowsAuthenticationModule は認証が失敗したときに発生するイベントを公開していないため、そのオプションは無効になっています。

何か案は?それとも、解決策のない木を吠えていますか?

4

1 に答える 1

3

私は同じ問題を見ていましたが、認証イベントがフォームとウィンドウで一般的であっても、Windows 認証のイベントがないようです。

しかし、私はこれに対する解決策を見つけました!

http://www.codeproject.com/Articles/11202/Redirecting-to-custom-401-page-when-quot-Access-de

アップデート

元記事より

protected void Application_EndRequest(Object sender, EventArgs e)
{ 
 HttpContext context = HttpContext.Current;
 if (context.Response.Status.Substring(0,3).Equals("401"))
 {
    if(User.Identity.IsAuthenticated)
    {
        // this means user is authenticated, but 401 still returned
        // which means no access to page or whatever you are trying to access?
    }
 } 
}

更新2

また、このソリューションがすべての場合に機能するとは限らないこともわかりました。私はさまざまな環境でテストしていたので、私にとってはうまくいきましたが、他の人にとってはそうではありませんでした。

デフォルトでは、IIS はこのコードを実行することさえせず、独自のエラー ページを返すだけです。必要なことは、アプリにエラーを処理させるよう IIS に指示することです。

<httpErrors existingResponse="PassThrough">
</httpErrors>

そうは言っても、IIS はこれ以上カスタム エラーを返さないので、アプリケーションでそれらを処理する必要があります。401だけでなく、403、405など

于 2013-09-13T13:39:46.280 に答える