【问题标题】:Which principal does PrincipalPermission.Demand() check against?PrincipalPermission.Demand() 检查哪个委托人?
【发布时间】:2018-09-24 09:31:57
【问题描述】:

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

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

当从 3rd 方作业调度框架内部调用它时,我遇到了一些问题。检查失败。我试过找出原因。 当我检查WindowsIdentity.GetCurrent().Name 的值时,它是一个用户(UserA),当我检查Thread.CurrentPrincipal.Identity.Name 时,它是另一个用户(UserB)。两个用户都应该有正确的访问权限,所以它不应该失败。 我怀疑它正在检查这两个以外的东西。

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

我很想得到一些帮助来弄清楚如何让它发挥作用。

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

【问题讨论】:

    标签: c# active-directory


    【解决方案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 的权限,这是我更喜欢的。

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多