2009-05-04 8 views
0

ユーザーのなりすまし中に問題が発生しています。宣言的なセキュリティ要求 - SecurityAction.Demandはキャッシュされていますか?

[PrincipalPermission(SecurityAction.Demand, [email protected]"DJPITER-PC\Test", Role="LocalTestGroup")] 
static void LocalTestGroupOnly() 
{ 
    Console.WriteLine("Inside LocalTestGroupOnly() - {0}", 
     WindowsIdentity.GetCurrent().Name); 
} 

呼び出し元のコードは次のとおりです:

WindowsImpersonationContext context = 
     WindowsIdentity.Impersonate(token); 

    Console.WriteLine("Calling LocalTestGroupOnly() as {0}", 
     WindowsIdentity.GetCurrent().Name); 
    LocalTestGroupOnly(); 

    context.Undo(); 

    try 
    { 
     // Reverted user is displayed properly 
     Console.WriteLine("Calling LocalTestGroupOnly() as {0}", 
      WindowsIdentity.GetCurrent().Name); 

     // This method should fail but if succeeds 
     LocalTestGroupOnly(); 
    } 
    catch (SecurityException ex) 
    { 
     Console.WriteLine("Your account lacks permission to that function."); 
    } 

デフォルトのユーザーがLocalTestGroupのメンバーではありません私はこのように宣言されたメソッドを持っています。 LocalTestGroupのトークンISメンバーによって示されるユーザー。

問題:トークンによって示されるユーザがLocalTestGroupのメンバーであるため

LocalTestGroupOnlyの最初の呼び出し()が成功しました。デフォルトユーザーが 'Test'でなく、LocalTestGroupに属していないため、LocalTestGroupOnly()への2番目の呼び出し(デフォルトユーザーとして)が失敗するはずです。問題は、この方法も成功するということです。

偽装ありと偽りなしでプログラムを個別に実行すると、「テスト」として偽装すると成功し、デフォルトユーザーとしてコールすると失敗します。

ここで問題は何ですか?

答えて

1

WindowsIdentity.GetCurrent()の代わりにThread.CurrentPrincipal.Identityを確認できますか? PrincipalPermission.Demand()は最初のものを使用します。

Thread.CurrentPrincipal(またはHttpContext.User)を変更するには、偽装後または元に戻す後に明示的に設定する必要があるようです。同様の質問についてはhereを確認してください。

+0

実際には:context.Undo()の後にThread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent())を追加する必要がありました。 なぜUndo()メソッドはそれをしませんでしたか?私はThread.CurrentPrincipalとWindowsImpersonationContextを完全に理解していないようです... – pkolodziej

+0

私はいくつかの例を調べました。それらはすべて、偽装するときに明示的にThread.CurrentPrincipalを設定しました。私は私の答えにいくつかの情報を追加しました。 –

+0

ありがとうございます - 良い一日を。 – pkolodziej

関連する問題