2011-07-29 22 views
14

私はそのユーザーを偽装することに成功しました。 LogonUser Interopを使用します(例:ASP.NETは私の権限を尊重することを拒否します。

[DllImport("advapi32.dll", SetLastError = true)] 
    static extern bool LogonUser(
     string principal, 
     string authority, 
     string password, 
     LogonSessionType logonType, 
     LogonProvider logonProvider, 
     out IntPtr token); 

これは問題なく動作します。私が直接ウィンドウに行き、WindowsIdentity.GetCurrent().Nameと入力すると、偽装されたユーザーがCurrentUserとして表示されます。このユーザーを解放すると、私の実際のユーザーに戻ります。ここに問題はありません。私はです。は偽装しています。私は、ユーザーがアクセス権を持っていることを共有にファイルを書き込もうとするとき

はしかし、私が取得:

Access to the path [path name] denied.

私は偽装しているユーザーとして手動でWindowsにログインできました。ナビゲーションして、ファイルを共有に書き込んでいます。ユーザーは、私が対象としているディレクトリへの管理権限を持っています。

私はエンドユーザーがファイルをアップロードできるようにしており、HttpPostedFileBaseオブジェクトを使用してこの共有にファイルを書き込みます。基本的には、ファイルをアップロードするために偽装をコードのブロックに制限しています。完了後、元の認証されたLDAPユーザーに戻ります。

imp = Impersonation.ImpersonateUser("someuser","somepassword"); 
HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase; 
... 
hpf.SaveAs(path); 
Impersonation.StopImpersonating(imp); 

パスは正しいです。

SaveAsメソッドを使用してファイルを保存すると、偽装を尊重していますか?

私が気付いていない別のアカウントでファイルを書き込もうとしていますか?もしそうなら、私はこれをどのように変更できますか?

SaveAsメソッドを使用すると、全体的に多くの制御がないように見えます。単一の過負荷ではありません。このオブジェクトを使用して自分の資格情報をより詳細に制御できる他の方法がありますか?

+8

authoritayが間違っています。 ;) –

+1

ターゲットマシンのイベントログを調べて、アクセス拒否またはログインエラーがあったかどうかを確認しましたか? – NotMe

+0

私は以下のようにダブルホップを調査しましたか? – ironsam

答えて

3

これはダブルホップ認証の問題のようです。ネットワーク共有にサイトのデフォルトIISユーザー(たとえばASPNET)へのアクセスを変更し、偽装コードなしでPOST/SaveAsを実行しようとしましたか?それが失敗した場合は、サーバーホップ認証の問題につながる可能性のあるものがIISでセットアップされているかどうかを確認する必要があります。

http://weblogs.asp.net/owscott/archive/2008/08/22/iis-windows-authentication-and-the-double-hop-issue.aspx

+0

あなたのアプリがリモートマシンにアクセスしようとしているときに、おそらくあなたのAppPoolに割り当てられたアカウントを使用しています。失敗したログインについてリモートマシンのログを調べ、リモートアクセスに使用されているアカウントを確認します。 – Zachary

+0

+1 - 私は前にこの問題を見てきました。それはダブルホップのためです。 – Fenton

0

あなたは「この共有にファイルを書きます」と言います。共有フォルダには、コンピュータ上のフォルダとは別のアクセス許可があります。あなたは共有のアクセス許可をチェックしましたか?

+0

私は、Windowsでの通常のユーザー認証を使用してユーザーとしてログインし、共有に移動して書き込めました。シェアをアクセスしようとしているコードを実行しているのと同じマシンです。 –

0

があなたのLogonSessionType値を調整してみてください:ここで開始するには良い場所かもしれません。私はネットワーク共有に保存するには、 "ネットワーク"として持っている必要がありますが、デフォルトは "インタラクティブ"です。

詳細:How To: Use Impersonation and Delegation in ASP.NET 2.0

関連する問題