代码忽略了PrincipalPermission属性?

时间:2010-11-08 21:20:21

标签: c# security permissions iprincipal

我在所有具有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
        }

并且不会知道,这个工作得很好!....关于它为什么单向工作而不是另一个工作的任何想法?

3 个答案:

答案 0 :(得分:2)

你有没有得到答案?我刚刚在我自己的应用程序中对此进行了测试,效果非常好。我特意不添加

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

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

但我确实发现,如果我用以下方法装饰我的类,那么装饰就不起作用了。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您是否验证过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();
}