PrincipalPermission.Demand()根据哪个主体进行检查?

时间:2018-09-24 09:31:57

标签: c# active-directory

我在通用库中有一些代码可以进行授权检查

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);    
new PrincipalPermission(null, "AD_GROUP_NAME").Demand();

从第3方作业调度框架内部调用它时,我遇到了一些问题。检查失败。我试图弄清楚为什么。 当我检查WindowsIdentity.GetCurrent().Name的值时,它是一个用户(UserA),当我检查Thread.CurrentPrincipal.Identity.Name时,它是另一个用户(UserB)。两个用户都应该具有正确的访问权限,这样才不会失败。 我怀疑它正在检查除这两个以外的其他东西。

我做了一个小的测试程序,只做检查。我已经使用Runas命令与UserA和UserB一起运行它,并且当我这样做时都通过了检查。

我很乐意帮助您弄清楚如何使其工作。

更新:我很确定对Thread.CurrentPrincipal(即UserB)进行了检查。调试时,可以看到主体是ClaimsPrincipal而不是WindowsPrincipal。我假设SetPrincipalPolicy调用没有任何效果。该文档似乎暗示需要在创建线程之前完成调用,而实际上不是。第三方框架在线程到达我的代码之前对其进行了设置。

1 个答案:

答案 0 :(得分:1)

问题是Thread.CurrentPrincipal不是Windows主体。

我添加了一些代码以将主体设置为基于WindowsIdentity.GetCurrent()的新WindowsPrincipal。完成授权检查后,我将主体恢复为以前的值

var savedPrincipal = Thread.CurrentPrincipal;
try
{
     Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

     // Call the code that does the authorization check
}
finally
{
     Thread.CurrentPrincipal = savedPrincipal;
}

这也将检查UserA的权限,这是我希望的。