これはおそらく、なりすましと、発生しているさまざまな認証方法の不一致の組み合わせです。
多くの作品があります。それらを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 つ目の方法は、暗号化されたアカウントとパスワードをレジストリに保存することです。この手順は少し複雑で、この説明の範囲を超えています。
幸運を!