次の方法で共有


偽装と復帰

注意

この記事は Windows に適用されます。

ASP.NET Core の詳細については、「ASP.NET Core のセキュリティ」を参照してください。

場合によっては、Windows アカウント トークンを取得して、Windows アカウントを偽装する必要があります。 たとえば、ASP.NET ベースのアプリケーションが、時間によって複数のユーザーの代わりに操作しなければならない場合があります。 その場合、アプリケーションはインターネット インフォメーション サービス (IIS) から管理者を表すトークンを受け入れて、そのユーザーを偽装し、操作を実行してから前の ID に戻ります。 続いて、IIS から管理者より権限が少ないユーザーを表すトークンを受け入れ、操作を実行してから、また元に戻ります。

アプリケーションが、IIS によって現在のスレッドにアタッチされていない Windows アカウントを偽装しなければならない場合は、そのアカウントのトークンを取得し、そのトークンを使用してアカウントをアクティブ化する必要があります。 それには、次のタスクを実行します。

  1. アンマネージ LogonUser メソッドを呼び出すことによって、特定のユーザーのアカウント トークンを取得します。 このメソッドは、.NET の基底クラス ライブラリには含まれていませんが、アンマネージ advapi32.dll 内にあります。 アンマネージ コード内のメソッドへのアクセスは高度な操作であり、ここでは説明しません。 詳細については、「アンマネージ コードとの相互運用」を参照してください。 LogonUser メソッドと advapi32.dll の詳細については、プラットフォーム SDK ドキュメントを参照してください。

  2. WindowsIdentity クラスの新しいインスタンスを作成し、トークンを渡します。 次のコードに、この呼び出しを示します。ここで、hToken は Windows トークンを表します。

    WindowsIdentity impersonatedIdentity = new WindowsIdentity(hToken);  
    
    Dim impersonatedIdentity As New WindowsIdentity(hToken)  
    
  3. このコードに示されているように、WindowsImpersonationContext クラスの新しいインスタンスを作成し、そのインスタンスを、初期化されたクラスの WindowsIdentity.Impersonate メソッドで初期化することで、偽装を開始します。

    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate();  
    
    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate()  
    
  4. 偽装する必要がなくなったら、以下のコードに示されているように WindowsImpersonationContext.Undo メソッドを呼び出して、偽装を元に戻します。

    myImpersonation.Undo();  
    
    myImpersonation.Undo()  
    

信頼されるコードによって WindowsPrincipal オブジェクトが既にスレッドにアタッチされている場合は、アカウント トークンを取らないインスタンス メソッド Impersonate を呼び出すことができます。 この方法が役立つのは、スレッドで WindowsPrincipal オブジェクトが表しているユーザーが、現在プロセスが実行されているユーザーではない場合のみです。 このような状態は、たとえば、Windows 認証を有効にして、偽装を無効にした ASP.NET を使用している場合に発生することがあります。 その場合、プロセスはインターネット インフォメーション サービス (IIS) で構成されたアカウントで実行されますが、現在のプリンシパルは、ページにアクセスしている Windows ユーザーを表しています。

ImpersonateUndo のいずれでも、現在の呼び出しコンテキストに関連する Principal オブジェクト (IPrincipal) は変更されないことに注意してください。 偽装と元に戻す操作によって変更されるのは、現在のオペレーティング システム プロセスに関連付けたトークンです。

関連項目