24

イントラネット上に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に展開した場合は機能しません。

アクセス拒否エラーが発生します。正しいユーザーが偽装されている場合のエラーの理由は何ですか?

4

1 に答える 1

27

偽装により、マシン間の偽装が可能になるため、クライアント ブラウザーとサーバーは、偽装に関して同じページにいます。その後、ネットワーク共有にアクセスしようとすると、コンピューターは偽装された資格情報を信頼しません。

Active Directory で IIS マシンの委任を有効にする必要があります。[Active Directory ユーザーとコンピューター] に移動し、コンピューターを見つけて、[プロパティ] をクリックし、[委任に対してコンピューターを信頼する] をクリックします。(これを機能させるには、IIS を再起動する必要があるかもしれませんが、覚えていません)。

私が完全には理解していないこれよりもはるかに多くの理論がありますが、これはうまくいくはずです。それが正しいかどうかにかかわらず、他の誰かがコメントすることができます!

また、開発マシンで動作する理由は、開発サーバーが (Local)\Network Service ではなく開発者として実行されるためです。


まともなリンク:

http://msdn.microsoft.com/en-us/library/cc949004.aspx

偽装と委任の違いは何ですか?

偽装は、元の呼び出し元の ID を同じコンピューター上のバックエンド リソースに流します。委任により、元の呼び出し元の ID が、サービスを実行しているコンピューター以外のコンピューター上のバックエンド リソースに流れます。

たとえば、サービスが偽装なしで IIS 内で実行されている場合、サービスは IIS 5.0 の ASP.NET アカウントまたは IIS 6.0 のネットワーク サービス アカウントを使用してリソースにアクセスします。偽装では、クライアントが元の呼び出し元のアカウントを使用して接続している場合、サービスは、システムの ASP.NET アカウントではなく元の呼び出し元のアカウントを使用して、同じコンピューター上の SQL Server データベースなどのリソースにアクセスします。委任は、SQL Server データベースがサービスに対してリモートの別のマシン上にある可能性があることを除いて同様です。

于 2009-09-10T14:37:02.373 に答える