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的权限,这是我更喜欢的