2012-05-08 24 views
0

私は以下を使用していますMicrosoft example。 WindowsIdentityインスタンスが.Impersonate()を呼び出すたびに何も起こりません。エラーも偽装もありません。
呼び出しの前と後の両方で、現在のIDは常にAppPool IDです。
また、オンラインで別の例が見つかったので、the Impersonator classと同じことが起こります。WindowsIdentity.Impersonateを呼び出しても何もしません。

これらの例に加えた唯一の変更は、LogOnUser呼び出しでLOGON32_LOGON_INTERACTIVEをLOGON32_LOGON_NETWORKに変更することです。Interactiveを使用すると常に0エラーが返されるためです。

これは、ADでユーザーを偽装しようとするWin2k8サーバーで実行されているASP.NET 4.0アプリケーションです。

EDIT: 私はもともとこれを言及していなかったが、私は、Microsoftの例を変更し、私は私のASP.NETアプリケーションからそれをできたことができるように、クラスにそれを回しました。 web.configにはimpersonate=trueもあります。

+0

ASP.Netアプリケーション全体を特定のユーザーに偽装したいのですか、または別のユーザーに偽装したいだけですか(たとえば、メソッド呼び出し中)? –

+0

一時的に...ファイルアクセス用です。各ユーザーはアプリにログインします(フォームのログイン)。アプリは、アプリサーバーのADに対してユーザーを認証します。一般的に、ユーザはapppoolのアイデンティティの下でアプリケーションを動作させることができます。ただし、ファイルアクセスが必要なユーザーもいます。私はその後、ユーザーとして(私は彼らのログインの詳細があるので)偽装したい。また、すべてのユーザーがサーバーにファイルアクセス権を持つわけではありません。 – eych

答えて

0

App_Dataにへの書き込みアクセスを与えますUsersグループのフォルダで問題が解決されました。偽装とは何が関係しているのかは分かりません。

0

リンクする例はコンソールアプリケーション用です。訪問者のセキュリティコンテキストでコードを実行するASP.Net Webアプリケーションがある場合は、IIS認証設定(IISマネージャーのMMCスナップイン)でASP.Net偽装を有効にすることができます。

+0

私の編集を参照してください...私はクラスにコンソールアプリケーションをオンにしました。私の主な関心事は、実際の偽装の詳細です。 – eych

+0

状況は非常によく似ています。http://stackoverflow.com/questions/1066275/impersonate-using-forms-authentication フォーム認証の代わりにWindows認証を使用するのが一般的です実際にサポートされていないソリューションをハッキングするために費やしている価値は本当に価値がありますか?) 以下に述べるすべての偽装は完全なユーザーログオンを必要とします。 Webアプリケーションはかなり遅いです... –

+0

ユーザーはどのコンピュータからでもログインできるため、フォームです。ユーザーの要望によりログインフォームが必要です。 – eych

1

私は結局2〜3年前に同様のことをしたヘルパークラスを見つけました。ヘルパーはIDisposableをを実装し、これだけのように「使用」でファイルのアクセスコードをラップ: -

using (Impersonate imp = new Impersonate()) 
{ 
    // Code in here will run under the identity specified in the helper 
} 

そして、ここでは(私はいくつかのスペースを節約するために「usings」を削除したヘルパークラスのコードです)。あなたは、ユーザーアカウントがコンストラクタでハードコードされて気づくでしょう:

internal class Impersonate : IDisposable 
{ 
    private const int LOGON32_LOGON_INTERACTIVE = 2; 
    private const int LOGON32_PROVIDER_DEFAULT = 0; 

    private bool _disposed = false; 
    private WindowsImpersonationContext _context = null; 

    [DllImport("advapi32.dll")] 
    private static extern int LogonUserA(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken); 

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool RevertToSelf(); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    private static extern bool CloseHandle(IntPtr handle); 

    internal Impersonate() 
    { 
     WindowsIdentity tempWindowsIdentity; 
     IntPtr token = IntPtr.Zero; 
     IntPtr tokenDuplicate = IntPtr.Zero; 

     string domain = "<whatever>"; 
     string username = "<whatever>"; 
     string password = "<whatever>"; 

     try 
     { 
      if (RevertToSelf()) 
      { 
       if (LogonUserA(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0) 
       { 
        if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
        { 
         tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); 
         _context = tempWindowsIdentity.Impersonate(); 
        } 
       } 
      } 
     } 
     finally 
     { 
      if (token != IntPtr.Zero) 
      { 
       CloseHandle(token); 
      } 

      if (tokenDuplicate != IntPtr.Zero) 
      { 
       CloseHandle(tokenDuplicate); 
      } 
     } 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool disposing) 
    { 
     if (!_disposed) 
     { 
      if (disposing) 
      { 
       // Dispose any managed resources here. 
      } 

      // Stop the impersonation. 
      _context.Undo(); 

      _disposed = true; 

     } 
    } 
} 

それをやってみると、私はあなたが乗る方法を知ってみましょう...

をアンドリュー

+0

それは私が持っているものに非常に似ています。問題は 'tempWindowsIdentity.Impersonate()'の呼び出しにあります。それは偽装せず、エラーを投げません。現在のIDは同じままです。この問題は、サーバー/ AD設定または許可の問題でなければなりません。ネット上のすべての例はこれに似ています。とにかくありがとう。 – eych

+0

あなたはあなたのコードではないことは知っています。特権の問題のように聞こえる。 LogonUserを呼び出した後で最後のエラーを取得しようとしましたか(こちらを参照してください:http://stackoverflow.com/questions/996429/logonuser-and-delegation)。また、ASP.Netプロセスアカウントに「サーバーのオペレーティングシステムの一部として機能する」特権を与え、偽装しようとしているアカウントがサーバーにログオンできることを確認してください。 –

関連する問題