ASP.NET での一般的なアクセス許可とセキュリティ関連の問題のトラブルシューティング

この記事では、ASP.NET で一般的なアクセス許可とセキュリティ関連の問題のトラブルシューティングを行う方法について説明します。

元の製品バージョン: ASP.NET
元の KB 番号: 910449

便利なツール

壊れたものを修正する前に、いくつかのツールを理解しておく必要があります。これは、問題を絞り込むのに役立ちます。 ここでは、FileMon、RegMon、セキュリティ監査などのツールに関心があります。 FileMon の詳細については、「 FileMon for Windows v7.04」を参照してください。

RegMon の詳細については、「 Windows Sysinternals」を参照してください。

ドリルダウンして問題を特定する

  • アプリケーションは機能したことがありますか? はいの場合、アプリケーションが中断された可能性のある変更は何ですか? ソフトウェア更新プログラムまたはセキュリティ更新プログラムがサーバーに適用された可能性があります。 コードのロールアウトによって問題が発生した可能性もあります。
  • 単純な .html ページと.aspページは IIS から提供されますか?
  • アプリケーションは別のバージョンの IIS に移行されましたか?
  • サーバー上の他の ASP.NET アプリケーションが同じエラーで失敗しますか? これが失敗する唯一のアプリケーションですか?
  • この問題は、すべてのユーザーまたは特定のユーザーに対してのみ発生しますか?
  • この問題は、Web サーバーでローカルで参照しているときに再現可能ですか、それとも少数のクライアントに対してのみ再現可能ですか?
  • 偽装を使用している場合、偽装されたユーザーはリソースに必要なアクセス権を持っていますか?

上記の質問は、問題を診断するために役立ちます。 ASP.NET フォーラムのいずれかに問題を投稿していて、これらの質問のほとんどに対する回答が既にある場合は、問題への迅速なポインターまたは解決策が得られる可能性があります。 重要なのは、ASP.NET アプリケーションの実行中に "アクセス拒否エラーが発生しています" という代わりに、ASP.NET スタック トレース エラー全体 (該当する場合) を投稿することです。 誰でも助けることができますか?誰かがスタック トレースを見て、完全なエラー メッセージを見ることができるときにポインターを提供する方がはるかに簡単です。 だから、あなたは自分自身に尋ねる必要があります...

正確なエラー メッセージは何ですか?

お客様に最初に質問するのは、「正確なエラー メッセージとは何ですか?」です。Microsoft .NET Frameworkによってスローされたエラー メッセージの明確な説明がある場合は、このセクションをスキップできます。 アプリケーションで実際のエラー メッセージがマスクされ、代わりに "予期しないエラーが発生しました。 詳細については、Web サイト管理者にお問い合わせください。"それは誰にもあまり使用されません。 実際のエラー メッセージを取得するのに役立ついくつかの手順を次に示します。

  • アプリケーション ディレクトリで Web.config ファイルを見つけて開き、 customErrors を mode="Off" に変更します。 ファイルを保存し、問題を再現します。

  • アプリケーション開発者がカスタム イベント/エラー処理を行うため、上記の手順に従った後でも、実際のエラー メッセージを表示できない場合があります。 Global.asax ファイルで Application_Error イベントを見つけ、関数を使用 Server.Transfer("Errors.aspx") してカスタム エラー ページに移動するコードをコメントアウトできます。

    //Global.asax 
    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs 
        //Server.Transfer("Errors.aspx"); 
    }
    

実際のエラー メッセージが表示されたら、それを読んで、ローカル リソースに対するアクセス許可がないか、ASP.NET アプリケーションがアクセスしようとしているリモート リソースに対するアクセス許可が見つからないことが原因でエラーが発生したかを確認します。

ヒント

実際のエラー メッセージを表示する方法については、開発者に問い合わせてください。 開発者がファイルにログを記録したり、電子メール通知を受け取ったりしている可能性があります。 常に、変更するファイルのバックアップを作成してください。 バックアップを使用できる場合は、いつでも変更をロールバックできます。

問題は、ASP.NET アプリケーションがアクセスを試みるローカル リソースに対するアクセス許可がないために発生します

カスタム エラー メッセージが原因で問題の明確な説明を取得できない場合は、FileMon を実行して問題を再現します。 キャプチャを停止して FileMon.xls 保存し、Microsoft Excel でファイルを開きます。 [ データ ] メニューの [ フィルター] をクリックし、[ オートフィルター ] をクリックして Excel のフィルター機能を使用します。 次に、列 F のドロップダウン リストを選択し、"ACCESS DENIED" エラーを探します。

FileMon の出力例を次に示します。

10381 1:01:11 PM w3wp.exe:2320 OPEN C:\winnt\microsoft.net\framework\v1.1.4322\Temporary ASP.NET Files\sessiontest\8832e585\275ec327\global.asax.xml 
ACCESS DENIED NT 
AUTHORITY\NETWORK SERVICE

フィルター処理された結果からわかるように、問題の原因を絞り込みます。 FileMon は、NT AUTHORITY\NETWORK SERVICE アカウントにフォルダーに対する C:\Winnt\Microsoft.net\Framework\v1.1.4322\Temporary ASP.NET Files NTFS アクセス許可が見つからないことを示しています。 これは直ちに修正する必要があります。

ヒント

問題を解決するかどうかを確認するには、ASP.NET プロセス アカウントを管理 アカウントに変更することをお勧めします。 IIS 6.0 以降のバージョンでは、IIS AppPool ID を "ローカル システム" に変更して、アプリケーションが動作するかどうかを確認します。

注:

これはソリューションとしてではなく、トラブルシューティング手順としてのみ使用する必要があります。

ほとんどのユーザーは、Microsoft .NET Frameworkを再インストールしたり、オペレーティング システムを再インストールしたりする傾向があります。 これは推奨されるトラブルシューティング手順ではなく、問題が再発しないことを保証するものではありません。 私はそのような例を1つ提供します。 断続的な問題は、多くの場合、分離とトラブルシューティングが困難です。 このシナリオでは、顧客のアプリケーションは数時間正常に動作し、突然、次のエラーで失敗します。 お客様は、.NET Frameworkとオペレーティング システムの再インストールを既に試みました。 これは数日間問題を解決するように見えたが、その後再び現れた。

FileMon を実行しても 、ACCESS DENIED エラーは 表示されませんでした。 ASPNET アカウントに必要なすべてのアクセス許可が設定されました。 問題から回復する唯一の方法は、ボックスを再起動することです。 IIS のリセットでも役に立たないでしょう。 あなたは"ああ、Microsoft Softwareは常に回復するために再起動が必要ですか?さて、あなたは間違っています!

ここで重要なのは、エラー メッセージをよく確認することです。 エラーは、通常の ACCESS DENIED エラーではなく、「書き込みのためにファイルを開くことができません」と明確に示されているため、ファイルまたはフォルダーのロックを保持し、ASP.NET が書き込みを許可していない他のプロセスであると考えています。 再起動によって他のプロセスが強制終了され、不正なプロセスによってファイルが再度ロックされるまで、ASP.NET アプリケーションが再び動作し始めるのは理にかなっています。 論理的なことは、すべてのウイルス対策プログラム、サードパーティのスパイウェア、またはサーバー上で実行されるその他のファイル監視ソフトウェアをオフにすることです。 私は特定のサードパーティ製ソフトウェアを指摘したくありません。 しかし、一般的に、ウイルス対策ソフトウェアは、IISと ASP.NET アプリケーションに多くの悲しみを引き起こすことが知られています。 ウイルス対策ソフトウェアによって引き起こされるもう 1 つの既知の問題は、Bin フォルダーまたは .config ファイルがタッチされたときに AppDomain のリサイクルが原因でセッションが失われることです。

ヒント

サードパーティのサービスをオフにする最も簡単な方法は、次のとおりです。

  1. [ スタート] をクリックし、[ 実行] をクリックし、「 msconfig」と入力します。
  2. [サービス] を選択し、[すべての Microsoft サービスを非表示にする] をチェックします。
  3. [ すべて無効にする] をクリックして、サード パーティのサービスを停止します。
  4. [ スタート] をクリックし、[ 実行] をクリックし、「iisreset」と入力して CLR をワーカー プロセスに再読み込みします。

アプリケーションを監視して、問題が再発するかどうかを確認します。 複数のウイルス対策プログラムを実行する場合は、試用版とエラーの方法を使用して、問題の原因となっている特定のプログラムを特定します。

注:

同じエラーが 100% の時間で再現可能な場合は、ウイルス対策ソフトウェアが原因ではない可能性があります。 このエラーの他の原因が考えられます。 Test.aspx ページで同じエラーが発生するかどうかを特定するには、単純な ASP.NET テスト アプリケーションを作成してみてください。 その場合は、必要なAccess Control Lists (ACL) がすべて ASP.NET に配置されていることを確認します。

ASP.NET 必須Access Control Lists (ACL)」を参照してください

ヒント

フォルダーは %SystemRoot%\Assembly グローバル アセンブリ キャッシュです。 Windows エクスプローラーを直接使用して、このフォルダーの ACL を編集することはできません。

代わりに、コマンド プロンプトを使用し、次のコマンドを実行します。

cacls %windir%\assembly /e /t /p domain\useraccount:r

または、Windows エクスプローラーを使用する前に、次のコマンドを使用して Shfusion.dll の登録を解除して、GUI を介してアクセス許可を付与します。

C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32-u shfusion.dll

Windows エクスプローラーでアクセス許可を設定したら、次のコマンドを使用して Shfusion.dll を再登録します。

C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32 shfusion.dll

ASP.NET アプリケーションがアクセスしようとしているリモート リソースに対するアクセス許可がないために発生する問題

ASP.NET アプリケーションが Microsoft SQL Server や UNC (汎用名前付け規則) 共有などのリモート リソースにアクセスしている場合、問題が発生する可能性があります。 また、リモート リソースに多くのことが正しく設定されていない可能性があります。 リソースを動作させるには、これらの問題のトラブルシューティングを行う必要があります。

最初の手順は、Windows エクスプローラーを介してリモート サーバーに接続できるかどうかを確認することです。

  1. リモート サーバーで、Test という名前のフォルダーを作成します。 [テスト] フォルダーの [ 共有 ] タブと [ セキュリティ ] タブで、ドメイン/アカウントと、ASP.NET アプリケーションで使用されるプロセス アカウントを追加し、両方のフル コントロールを付与します。

  2. IIS サーバーで、ドメイン/アカウントでログインし、[スタート] をクリックし、[実行] をクリックし、リモート サーバーの UNC 共有パスを入力します。 \\RemoteServerName*\Test

    このフォルダーにアクセスできない場合は、ネットワーク管理者に問い合わせてこの問題を解決してください。 その場合にのみ、ASP.NET アプリケーションが共有にアクセスできます。

  3. 次のコード を使用して CreateUNCFile.aspx という名前のファイルを作成し、ファイルをアプリケーション ディレクトリに保存します。

    <%@ Page Language="vb" %>
    <%@ Import Namespace="System.IO" %>
    <html>
    <head>
    <title>Writing to a Text File</title>
    <script runat="server">
        Sub WriteToFile(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim fp As StreamWriter
                fp = File.CreateText("\\<RemoteServerName>\Test\" & "test.txt")
                fp.WriteLine(txtMyFile.Text)
                lblStatus.Text = "The File Successfully created! Your ASP.NET process is able to access this remote share"
                fp.Close()
        End Sub
    </script>
    
    </head>
    <body style="font: 10pt verdana">
                <h3 align="center">Creating a Text File in ASP.NET</h3>
        <form id="Form1" method="post" runat="server">
                            Type your text:
                            <asp:TextBox ID="txtMyFile" TextMode="MultiLine" Rows="10" Columns="60" Runat="server" /><br>
                            <asp:button ID="btnSubmit" Text="Create File" OnClick="WriteToFile" Runat="server" />
                            <asp:Label ID="lblStatus" Font-Bold="True" ForeColor="#ff0000" Runat="server" />
        </form>
    </body>
    </html> 
    
  4. 次のコード行で RemoteServerName> を変更<してください

    fp = File.CreateText("\\<RemoteServerName>\Test\" &"test.txt")
    

    リモート サーバーの名前が反映されるようにします。

  5. Windows インターネット エクスプローラーを開き、IIS サーバー以外のクライアント コンピューターから をhttp://**IISServerName**/**AppName**/CreateUNCFile.aspx参照します。

  6. Test.txt ファイルが正常に作成された場合、ASP.NET アプリケーションはリモート リソースに対して認証できます。

  7. インターネット エクスプローラー クライアント ブラウザーからファイルの作成が失敗したが、IIS サーバー自体から同じページを参照した場合に機能する場合は、"ダブル ホップ" シナリオが実行されている可能性があります。 カスタム ビルド Web パーツを使用して、ユーザー認証と承認を必要とするリモート リソースにアクセスする場合は、おそらく "ダブル ホップ" の問題が発生します。 リモート リソースにアクセスするには、リソースからの出力がエンド ユーザーがアクセス許可を持つデータに制限されるように、エンド ユーザーの資格情報をリソースに指定する必要がある場合があります。

上記の手順では、IIS で NTLM 認証が有効になっていることを前提としています。 基本認証では Kerberos は使用されません。

詳細については、「インターネット エクスプローラーでの Kerberos エラーのトラブルシューティング」を参照してください。

IIS 認証方法の詳細については、 Visual Studio 2003 の廃止された技術ドキュメントを参照してください

ヒント

リモート UNC 共有に接続できるが、ASP.NET アプリケーションからSQL Server実行されているリモート サーバーに接続できない場合は、SQL Serverのサービス プリンシパル名 (SPN) をチェックまたは設定する必要がある場合があります。 IIS でアプリケーションの基本認証のみを有効にして、SQL Serverを実行しているリモート サーバーに接続できるかどうかを確認してください。

"サーバー アプリケーションを使用できません" というエラー メッセージには、他にも多数の原因があります。 イベント ログは、問題の原因の詳細を取得することをお勧めします。

IIS ログは、IIS 認証関連のエラーが発生した場合に役立ちます。

検索する必要があるのは、この特定のエラーの状態コードとサブ状態コードです。

2006-10-12 22:47:28 W3SVC1 65.52.18.230 GET /MyAPP/login.aspx - 80  
MyDomain\UserID_91 65.52.22.58 Mozilla/4.0+  
(compatible;+MSIE+6.0;+Windows+NT+5.2;+SV1;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+InfoPath.1) 401 3 5

サブステータス 3 の 401 が表示されます。これは、"リソース上の ACL が原因で承認されていません" を示します。

これは、ファイルまたはフォルダーに NTFS アクセス許可が見つからない場合を示します。 このエラーは、アクセスしようとしているファイルのアクセス許可が正しい場合でも発生する可能性がありますが、既定のアクセス許可とユーザー権限が他の SYSTEM フォルダーと IIS フォルダーに存在しない可能性があります。 たとえば、IUSR_ComputerName アカウントが C:\Winnt\System32\Inetsrv ディレクトリにアクセスできない場合、このエラーが発生することがあります。

ヒント

[ スタート] をクリックし、[ 実行] をクリックし、「ログ ファイル」と入力して、IIS ログを含むフォルダーを開きます。 または、IIS の Web サイトのプロパティ ページで[ WebSiteName]\(WebSiteName \) タブをクリックし、[ アクティブ なログ形式] の [ プロパティ ] をクリックして、ログ ファイルのディレクトリと名前を表示します。

ここで関心のあるもう 1 つの点は、状態コード 5 です。 net helpmsg コマンドを使用して、この状態コードに関する詳細情報を取得できます。

C:\Documents and Settings\User> net helpmsg 5

アクセスが拒否されました。

別の一般的な状態コード (コード 50) を試してみましょう。

C:\Documents and Settings\User> net helpmsg 50

要求はサポートされていません。

ヒント

別の一般的な悪名高い "500 内部サーバー エラー" メッセージが表示されたら、エラーの詳細な説明を受け取るように、フレンドリ HTTP エラー メッセージを無効にすることをお勧めします。 イベント ビューアーには詳細情報も含まれる可能性があるため、忘れないでください。

考え方は、使用可能なすべてのログ情報を使用して、問題に関する最大の詳細を取得することです。

リソース

詳細については、以下を参照してください: