イントラネット上にMVCWebアプリケーションがあり、FTPサーバー上にファイルを作成して外部パートナーに送信できるようにしたいと考えています。
偽装のコードはWindowsImpersonationContextを使用します。
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
StreamWriter sw = System.IO.File.CreateText("PathOnFTPServer");
sw.Write("data");
impersonationContext.Undo();
何が起こっているのか、そして私の質問の理由は次のとおりです。
なりすまし前
User.Identity.Name:[私のWindows資格情報]
System.Security.Principal.WindowsIdentity.GetCurrent()。Name:NT AUTHORITY\NETWORK SERVICE
偽装後
User.Identity:[私のWindows資格情報]
GetCurrent.Name:[私のWindows資格情報]
偽装元に戻す
User.Identity:[私のWindows資格情報]
GetCurrent.Name:NT AUTHORITY\NETWORK SERVICE
したがって、偽装する前は、現在のユーザーはシステムアカウントですが、偽装後は、FTPサーバー上にテキストファイルを作成する権限を持つWindowsドメインアカウントを使用しています。コードは、Visual Studio Webサーバーを使用してローカルで機能しますが、テストサーバーのIISに展開すると機能しません。
アクセス拒否エラーが発生します。正しいユーザーが偽装されている場合のエラーの理由は何ですか?
偽装により、マシン間の偽装が可能になるため、偽装に関しては、クライアントブラウザとサーバーが同じページにあります。その後、ネットワーク共有にアクセスしようとすると、コンピューターは偽装された資格情報を信頼しません。
ActiveDirectoryのIISマシンの委任を有効にする必要があります。ActiveDirectoryユーザーとコンピューターに移動し、コンピューターを見つけて、プロパティをクリックし、[委任のためにコンピューターを信頼する]を選択します(必要な場合があります)。再起動IISこれが機能するためには、覚えていません)。
私が完全には理解していないこれよりもはるかに多くの理論がありますが、これはうまくいくはずです。それが正しいかどうかにかかわらず、他の誰かがコメントすることができます!
また、開発マシンで動作する理由は、開発サーバーが(ローカル)\ネットワークサービスではなく、開発者として実行されるためです。
まともなリンク:
http://msdn.Microsoft.com/en-us/library/cc949004.aspx
なりすましと委任の違いは何ですか?
偽装は、元の発信者のIDを同じコンピューター上のバックエンドリソースに流します。委任は、元の呼び出し元のIDを、サービスを実行しているコンピューター以外のコンピューター上のバックエンドリソースに流します。
たとえば、サービスがIIS内で偽装なしで実行されている場合、サービスはIIS 5.0、またはネットワークサービスのASP.NETアカウントを使用してリソースにアクセスします。アカウントIIS 6.0。偽装では、クライアントが元の呼び出し元のアカウントを使用して接続している場合、サービスは、代わりに元の呼び出し元のアカウントを使用して、同じマシン上のSQLServerデータベースなどのリソースにアクセスします。システムASP.NETアカウント。委任は、SQL Serverデータベースがサービスから離れた別のマシンにある可能性があることを除いて、同様です。