Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PrincipalPermission.Demand()检查哪个主体?_C#_Active Directory - Fatal编程技术网

C# PrincipalPermission.Demand()检查哪个主体?

C# PrincipalPermission.Demand()检查哪个主体?,c#,active-directory,C#,Active Directory,我在一个通用库中有一些代码,可以像这样进行授权检查 AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); new PrincipalPermission(null, "AD_GROUP_NAME").Demand(); var savedPrincipal = Thread.CurrentPrincipal; try { Thread.CurrentPrincipal = n

我在一个通用库中有一些代码,可以像这样进行授权检查

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);    
new PrincipalPermission(null, "AD_GROUP_NAME").Demand();
var savedPrincipal = Thread.CurrentPrincipal;
try
{
     Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

     // Call the code that does the authorization check
}
finally
{
     Thread.CurrentPrincipal = savedPrincipal;
}
当从第三方作业调度框架内部调用时,我遇到了一些问题。检查失败。我试着找出原因。 当我检查
WindowsIdentity.GetCurrent().Name
的值时,它是一个用户(UserA),当我检查
Thread.CurrentPrincipal.Identity.Name
时,它是另一个用户(UserB)。两个用户都应该有正确的访问权限,这样就不会失败。 我怀疑它是在检查这两个以外的东西

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

我想得到一些帮助,弄清楚如何让它工作


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

问题在于
线程。CurrentPrincipal
不是Windows主体

我添加了一些代码,以便基于
WindowsIdentity.GetCurrent()
将主体设置为新的WindowsPrincipal。在进行授权检查后,我将主体恢复为以前的值,如下所示

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);    
new PrincipalPermission(null, "AD_GROUP_NAME").Demand();
var savedPrincipal = Thread.CurrentPrincipal;
try
{
     Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

     // Call the code that does the authorization check
}
finally
{
     Thread.CurrentPrincipal = savedPrincipal;
}
这也会检查UserA的权限,这是我更喜欢的