我在所有具有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
}
并且不会知道,这个工作得很好!....关于它为什么单向工作而不是另一个工作的任何想法?
答案 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();
}