10

Path.GetTempFileName を使用すると、特定のサーバーでディレクトリ名が無効であるというエラーが発生するという問題が発生します。さらに調査すると、c:\Documents and Setting\computername\aspnet\local settings\temp (Path.GetTempPath を使用して検出) にファイルを書き込もうとしていることがわかります。このフォルダーは存在するため、これは asp.net アカウントに関するアクセス許可の問題であると想定しています。

Path.GetTempFileName は C:\Windows\Microsoft.NET\Framework\v2.0.50727\temporaryasp.net ファイルを指している必要があると何人かから言われました。

また、この問題は、IIS と .NET がサーバーにインストールされた順序が原因である可能性があるとも言われました。私は典型的な「aspnet_regiis -i」を実行し、フォルダーなどのセキュリティをチェックしました。この時点で行き詰まっています。

誰でもこれに光を当てることができますか?

**更新:**フォルダへの「IUSR_ComputerName」アクセスを提供するとうまくいくことがわかりました。それは正しい手順ですか?過去にそれを行ったことを覚えていないようで、明らかに、セキュリティを維持するためのベスト プラクティスに従いたいと考えています。結局のところ、これはファイル アップロード プロセスの一部です。

4

5 に答える 5

18

これはおそらく、なりすましと、発生しているさまざまな認証方法の不一致の組み合わせです。

多くの作品があります。それらを1つずつ見ていきます。

偽装は、スレッドが実行されているユーザー アカウントを「一時的に」切り替える手法です。基本的に、スレッドは、偽装されているアカウントと同じ権限とアクセス権を一時的に取得します。それ以上でもそれ以下でもありません。スレッドが Web ページの作成を完了するとすぐに、元のアカウントに「戻り」、次の呼び出しの準備が整います。この手法は、Web サイトにログインしたユーザーのみがアクセスできるリソースにアクセスするために使用されます。コンセプトを1分間保持します。

現在、既定では、ASP.NET はASPNETというローカル アカウントで Web サイトを実行します。繰り返しになりますが、既定では、ASPNET アカウントと Administrators グループのメンバーのみがそのフォルダーに書き込むことができます。あなたの一時フォルダーは、そのアカウントの権限の下にあります。これがパズルの 2 番目のピースです。

なりすましは、それ自体では発生しません。web.config で意図的にオンにする必要があります。

<identity impersonate="true" />

設定がない場合、または false に設定されている場合、コードは上記の ASPNET アカウントで純粋かつ単純に実行されます。エラー メッセージを考えると、impersonation=true であることは間違いありません。それは何も悪いことではありません!なりすましには、この説明を超えた長所と短所があります。

1 つ質問があります。偽装を使用すると、どのアカウントが偽装されるのでしょうか?

web.config でアカウントを指定しない限り ( identity 要素の完全な構文はこちら)、偽装されたアカウントは、IIS が ASP.NET に渡したものです。それは、ユーザーがサイトにどのように認証されているか (または認証されていないか) によって異なります。それがあなたの 3 番目で最後の作品です。

IUSR_ComputerName アカウントは、IIS によって作成される権限の低いアカウントです。デフォルトでは、このアカウントは、ユーザーが認証されなかった場合にWeb 呼び出しが実行されるアカウントです。つまり、ユーザーは「匿名」として入ります。

要約すると、これはあなたに起こっていることです:

ユーザーが Web サイトにアクセスしようとしていますが、IIS は何らかの理由でユーザーを認証できませんでした。匿名アクセスがオンになっている (または一時フォルダーにアクセスしている IUSRComputerName が表示されない) ため、IIS はユーザーを一般ユーザーとして許可します。ASP.NET コードが実行され、この汎用 IUSR___ComputerName "ゲスト" アカウントを偽装します。コードは、ASPNET アカウントがアクセスできたもの (独自の一時フォルダーを含む) にアクセスできなくなりました。

フォルダーへの IUSR_ComputerName WRITE アクセスを許可すると、症状が解消されます。

しかし、それは単なる症状です。その人が「匿名/ゲスト」として来ている理由を確認する必要がありますか?

次の 2 つのシナリオが考えられます。

a) 認証に IIS を使用するつもりでしたが、一部のサーバーに対する IIS の認証設定が間違っています。

その場合、通常の認証メカニズムが行われるように、これらのサーバーで匿名アクセスを無効にする必要があります。ユーザーにその一時フォルダーへのアクセスを許可するか、ユーザーが既にアクセスできる別のフォルダーを代わりに使用する必要がある場合があることに注意してください。

私はこのシナリオに何度も取り組んできました。サーバーに専用フォルダーを作成し、適切なアクセス許可を設定し、web.config でその場所を設定します。

b) とにかく人を認証したくない、または ASP.NET フォーム認証 (IIS の匿名アクセスを使用して IIS のチェックをバイパスし、ASP.NET が認証を直接処理できるようにする) を使用したかった

このケースはもう少し複雑です。

IIS に移動し、「匿名アクセス」以外のすべての形式の認証を無効にする必要があります。デバッガーは統合認証を有効にする必要があるため、開発者のボックスではそれを行うことができないことに注意してください。そのため、デバッグ ボックスは実際のサーバーとは少し異なる動作をします。それを知っておいてください。

次に、偽装をオフにするか、逆に、偽装するアカウントを web.config で指定するかを決定する必要があります。Web サーバーが外部リソース (データベースなど) を必要としない場合は、最初に実行します。データベース (またはその他の外部リソース) にアクセスできるアカウントで Web サイトを実行する必要がある場合は、後者を実行してください。

偽装するアカウントを指定するには、さらに 2 つの方法があります。1 つは、IIS に移動して、「匿名」アカウントを、IIS が管理するアカウントではなく、リソースにアクセスできるアカウントに変更することです。2 つ目の方法は、暗号化されたアカウントとパスワードをレジストリに保存することです。この手順は少し複雑で、この説明の範囲を超えています。

幸運を!

于 2008-09-13T05:56:29.970 に答える
2

IIS_WPGが一時フォルダーにアクセスできないことが原因である可能性があります。アクセス許可の問題であると思われる場合は、 asp.net ワーカー プロセスでProcmonを実行し、AccessDenied エラーを確認します。

于 2008-09-10T22:18:26.547 に答える
0

ASP.Net アプリケーションの 1 つで同じ問題が発生していました。私はPath.GetTempPath()を取得していましたが、次の例外をスローしていました:

「ファイル "C:\Windows\Temp\somefilename" に書き込めませんでした。例外: パス "C:\Windows\Temp\somefilename" へのアクセスが拒否されました。」

このページでいくつかの提案を試みましたが、何も役に立ちませんでした。

最後に、Web サーバー (IIS サーバー) にアクセスし、サーバーの "C:\Windows\Temp" ディレクトリのアクセス許可を変更して、"Everyone" ユーザーに完全な読み取り/書き込みアクセス許可を与えました。

そして最後に、例外がなくなり、ユーザーはアプリケーションからファイルをダウンロードできるようになりました。ふぅ!

于 2013-02-07T09:44:31.693 に答える
0

Path.GetTempPath()を使用して、書き込み先のディレクトリを見つけることができます。

于 2008-09-10T22:15:58.067 に答える