宣言的なセキュリティ要求-SecurityAction.Demandはキャッシュされますか?
-
03-07-2019 - |
質問
ユーザーのなりすまし中に問題が発生しました。次のように宣言されたメソッドがあります:
[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
)を変更するには、偽装後または取り消し後に明示的に設定する必要があるようです。同様の質問については、こちらを確認してください。
所属していません StackOverflow