我的理解一直是,方法上的安全属性将覆盖类上的安全属性,但似乎不再是这样,正如下面的简单代码所演示的那样:
class Program
{
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)] //<-- this passes
class DumbClass
{
[PrincipalPermission(SecurityAction.Demand, Role = "ffff")] //<-- this passes (but shouldn't)
public string EchoMethod(string input)
{
return input;
}
}
static void Main(string[] args)
{
Thread.CurrentPrincipal = new ClaimsPrincipal(new ClaimsIdentity("manual"));
//this should throw becuase the principal is not in the role "ffff"
//BUT DOESN'T
Console.WriteLine(new DumbClass().EchoMethod("this"));
}
}如果我删除了类上的声明,那么我会得到预期的安全异常。我是不是漏掉了什么很明显的东西。我使用的是.Net 4.5
发布于 2018-06-06 04:18:13
由于使用OR组合PrincipalPermissionAttribute请求,并且类属性本质上与将属性添加到每个方法中相同,因此您的示例等同于:
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
class DumbClass
{
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public DumbClass()
{
}
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
[PrincipalPermission(SecurityAction.Demand, Role = "ffff")]
public string EchoMethod(string input)
{
return input;
}
}由于OR逻辑,您对Role="ffff“的要求是多余的。
如果您希望将EchoMethod限制为角色"ffff",并允许所有其他方法使用经过身份验证的用户,请将您的代码更改为:
class DumbClass
{
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public DumbClass()
{
}
[PrincipalPermission(SecurityAction.Demand, Role = "ffff")]
public string EchoMethod(string input)
{
return input;
}
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public string OtherMethod(string input)
{
return input;
}
}发布于 2015-10-23 03:44:04
按如下方式更改代码:
[PrincipalPermission(SecurityAction.Demand)] //<-- REMOVE Authenticated = true
class DumbClass
{
[PrincipalPermission(SecurityAction.Demand, Role = "ffff")] //<-- this passes (but shouldn't)
public string EchoMethod(string input)
{
return input;
}
}通过设置Authenticated = true,您可以显式地表明用户已经通过了身份验证,而他们可能已经通过了身份验证,也可能没有通过。
https://stackoverflow.com/questions/33289100
复制相似问题