0

ユーザーになりすます際に問題が発生しています。次のように宣言されたメソッドがあります。

[PrincipalPermission(SecurityAction.Demand, Name=@"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 のメンバーです。

問題:

LocalTestGroupOnly() の最初の呼び出しは成功します。これは、トークンによって示されるユーザーが LocalTestGroup のメンバーであるためです。LocalTestGroupOnly() への 2 回目の呼び出し (デフォルト ユーザーとして) は失敗するはずです。これは、デフォルト ユーザーが「Test」ではなく、LocalTestGroup に属していないためです。問題は、この方法も成功することです。

プログラムを個別に実行すると、偽装の有無にかかわらず動作が正しくなります。「テスト」として偽装すると成功し、デフォルトユーザーとして呼び出すと失敗します。

ここの問題は何ですか?

4

1 に答える 1

1

Thread.CurrentPrincipal.Identityの代わりにチェックしていただけますWindowsIdentity.GetCurrent()か?PrincipalPermission.Demand()最初のものを使用します。

変更Thread.CurrentPrincipal(またはHttpContext.User) するには、偽装後または取り消し後に明示的に設定する必要があるようです。同様の質問については、こちらをご覧ください。

于 2009-05-05T06:02:30.427 に答える