ユーザーのなりすまし中に問題が発生しています。宣言的なセキュリティ要求 - 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番目の呼び出し(デフォルトユーザーとして)が失敗するはずです。問題は、この方法も成功するということです。
偽装ありと偽りなしでプログラムを個別に実行すると、「テスト」として偽装すると成功し、デフォルトユーザーとしてコールすると失敗します。
ここで問題は何ですか?
実際には:context.Undo()の後にThread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent())を追加する必要がありました。 なぜUndo()メソッドはそれをしませんでしたか?私はThread.CurrentPrincipalとWindowsImpersonationContextを完全に理解していないようです... – pkolodziej
私はいくつかの例を調べました。それらはすべて、偽装するときに明示的にThread.CurrentPrincipalを設定しました。私は私の答えにいくつかの情報を追加しました。 –
ありがとうございます - 良い一日を。 – pkolodziej