質問

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

[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のメンバーであるためです。デフォルトユーザーは「Test」ではなく、LocalTestGroupに属していないため、LocalTestGroupOnly()への2回目の呼び出し(デフォルトユーザーとして)は失敗します。問題は、このメソッドも成功することです。

プログラムを個別に実行する場合-なりすましの有無にかかわらず、動作を修正します: 'Test'として偽装する場合は成功し、デフォルトユーザーとして呼び出す場合は失敗します。

ここの問題は何ですか?

役に立ちましたか?

解決

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top