demandas de segurança declarativa - É SecurityAction.Demand em cache?
-
03-07-2019 - |
Pergunta
Estou tendo um problema durante a representar um utilizador. Eu tenho um método declarado como este:
[PrincipalPermission(SecurityAction.Demand, Name=@"DJPITER-PC\Test", Role="LocalTestGroup")]
static void LocalTestGroupOnly()
{
Console.WriteLine("Inside LocalTestGroupOnly() - {0}",
WindowsIdentity.GetCurrent().Name);
}
O código de chamada é:
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.");
}
user padrão não é membro da LocalTestGroup. Usuário indicado pelo membro é sinal de LocalTestGroup.
O problema:
A primeira chamada para LocalTestGroupOnly () sucede porque o utilizador indicado pelo membro é um sinal do LocalTestGroup. A segunda chamada (como usuário padrão) para LocalTestGroupOnly () deve falhar porque o usuário padrão não é 'Test' e não pertence a LocalTestGroup. O problema é que este método também tem sucesso.
Se eu executar o programa separadamente - com e sem representação o comportamento nos corrigir:. Tem êxito quando se passar como 'Test' e falha ao chamar como usuário padrão
O que é o problema aqui?
Solução
Você pode verificar Thread.CurrentPrincipal.Identity
vez de WindowsIdentity.GetCurrent()
? PrincipalPermission.Demand()
utiliza o primeiro.
Para alterar Thread.CurrentPrincipal
(ou HttpContext.User
), parece que você tem que definir explicitamente depois de representação ou depois de uma desfazer. Verifique aqui para uma pergunta semelhante .