【问题标题】:Code is ignoring PrincipalPermission attribute?代码忽略了 PrincipalPermission 属性?
【发布时间】:2011-05-06 21:42:36
【问题描述】:

我对所有具有 PrincipalPermission 属性的业务对象都有一个 Delete 方法。

例子:

[PrincipalPermission(SecurityAction.Demand, Role = "Vendor Manager")]
        public static bool Delete(Vendor myVendor)
        {

            //do work here
        }

问题是它似乎完全忽略了我的 PrincipalPermission。它允许任何人通过,无论他们可能担任什么角色。

还有什么我忘记做的吗?我在应用程序启动部分的应用程序的 global.asax 中添加了以下内容:

AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);

但这也没什么区别。

我也尝试了以下方法:

public static bool Delete(Vendor myVendor)
        {
            PrincipalPermission iPerm = new PrincipalPermission(null, "Vendor Manager");
            iPerm.Demand();

            //do work here
        }

你不知道吗,这很好用!....关于为什么它以一种方式工作而不是另一种方式的任何想法?

【问题讨论】:

    标签: c# security permissions iprincipal


    【解决方案1】:

    对于任何说该样本不起作用的人只有一个观察结果。根据您当地的文化检查角色的名称。例如,如果您居住在墨西哥,则必须使用:@"BUILTIN\Administradores" 而不是 @"BUILTIN\Administrators"

    【讨论】:

      【解决方案2】:

      你得到答案了吗?我刚刚在自己的应用程序中对此进行了测试,并且效果很好。我特别没有添加

      AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
      

      而且,我正在使用表单身份验证(ASP.NET 成员资格)、MVC 2、.NET 3.5。

      然而,我发现如果我用以下方法装饰我的班级,我的方法装饰不起作用。

      [PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
      

      【讨论】:

      【解决方案3】:

      您是否验证过 Windows 主体没有碰巧拥有您需要的权限?像这样的东西(修改自here)——我认为——应该模仿这种行为并让你逐步完成。它应该表明是否授予权限。

      如果这通过了,那么我希望该属性也可以通过。如果这失败了,但属性通过了,那我和你一样难过。

      static void Main(string[] args)
      {
          AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
          PrincipalPermission principalPerm = new PrincipalPermission(null, "Vendor Manager");
          try
          {
              principalPerm.Demand();
              Console.WriteLine("Demand succeeded.");
          }
          catch (Exception secEx)
          {
              Console.WriteLine("Demand failed.");
          }
          Console.ReadLine();
      }
      

      【讨论】:

      • 哈.. 我刚试过这个。我在 Delete 方法的开头添加了这样的代码,并在这样做时正确地验证了用户。哼!
      • @Amanda -- 嗯......这令人沮丧。我试图做你(最初)所做的事情,并添加了一个具有该属性的方法。它似乎正确地“要求”了我的角色;花了一段时间,但当我尝试调用需要“供应商经理”角色的方法时,最终引发了安全异常。我不知道为什么它对你来说很糟糕(??)
      • 其实,我刚刚注意到你提到了 global.asax。我对 ASP.Net 并不熟悉,但我想知道这是否是差异。我已经在控制台应用程序中完成了所有测试,并且该属性似乎在该环境中按预期工作。
      • 是的。当我进行单元测试时,它可以正常工作。只是当它来自我的 Web 应用程序时,它与 BLL 层(此代码所在的位置)位于一个单独的项目中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多