代码之家  ›  专栏  ›  技术社区  ›  Hans Kilian

principapermission.Demand()检查哪个主体?

  •  0
  • Hans Kilian  · 技术社区  · 6 年前

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

    当我检查 WindowsIdentity.GetCurrent().Name 它是一个用户(UserA),当我检查 Thread.CurrentPrincipal.Identity.Name 它是另一个用户(UserB)。两个用户都应该有正确的访问权限,这样就不会失败。

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

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

    Thread.CurrentPrincipal SetPrincipalPolicy 呼叫没有效果。文档似乎暗示需要完成调用,因为线程已经创建,而它还没有创建。第三方框架在线程到达我的代码之前设置线程。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Hans Kilian    6 年前

    问题是 Thread.CurrentPrincipal 他不是Windows的校长。

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

    var savedPrincipal = Thread.CurrentPrincipal;
    try
    {
         Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
    
         // Call the code that does the authorization check
    }
    finally
    {
         Thread.CurrentPrincipal = savedPrincipal;
    }
    

    这也做了对UserA的权利,这是我更喜欢的检查。