我在通用库中有一些代码可以进行授权检查
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
调用没有任何效果。该文档似乎暗示需要在创建线程之前完成调用,而实际上不是。第三方框架在线程到达我的代码之前对其进行了设置。
答案 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的权限,这是我希望的。