C# 在类级别和方法级别应用ClaimsPrincipPermissionAttribute时发生异常
我有一个用C# 在类级别和方法级别应用ClaimsPrincipPermissionAttribute时发生异常,c#,.net,wif,claims-based-identity,code-access-security,C#,.net,Wif,Claims Based Identity,Code Access Security,我有一个用ClaimsPrincipalPermissionsAttribute装饰的类。该类有一个方法,该方法也用ClaimsPrincipalPermissionsAttribute修饰。我所期望的是: 首先,当我实例化这个类时,我会得到一个对自定义ClaimsAuthorizationManager的调用。这正如预期的那样有效 其次,当我调用该方法时,我得到两个对我的ClaimsAuthorizationManager的调用。一个具有类级属性中的资源和操作,另一个具有方法级属性中的资源和操
ClaimsPrincipalPermissionsAttribute
装饰的类。该类有一个方法,该方法也用ClaimsPrincipalPermissionsAttribute
修饰。我所期望的是:
首先,当我实例化这个类时,我会得到一个对自定义ClaimsAuthorizationManager
的调用。这正如预期的那样有效
其次,当我调用该方法时,我得到两个对我的ClaimsAuthorizationManager
的调用。一个具有类级属性中的资源和操作,另一个具有方法级属性中的资源和操作。这是行不通的。相反,我在调用该方法时会抛出一个SecurityException
。例外消息是:
无法解码嵌入的权限集对象
为了查看发生了什么,我通过从ClaimsPrincipalPermissionsAttribute
复制代码创建了一个自定义属性。我可以看到对我的属性调用了CreatePermission()
方法,它成功地返回了ClaimsPrincipalPermission,但在调用我的ClaimsAuthorizationManager
之前引发了异常
我的代码如下所示:
using System;
using System.IdentityModel.Services;
using System.Security.Permissions;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
var test = new SecuredClass();
test.MethodLevelSecuredMethod();
Console.ReadKey();
}
}
[ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "SecuredClass", Operation = "GeneralAccess")]
class SecuredClass
{
[ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "MethodLevelSecuredMethod", Operation = "Call")]
public void MethodLevelSecuredMethod()
{
Console.WriteLine("Called MethodLevelSecuredMethod");
}
}
}
我做错了什么?是否可以同时在类和方法级别声明属性
我使用的是.Net 4.5。出现问题的原因是
ClaimsPrincipalPermission
未实现接受PermissionState
参数的公共构造函数。(这需要被记录,尽管隐藏在文本的中间。)< /P>
这本质上是框架中的一个bug,可能应该在上报告。如果这样做,您可能还需要添加一个FxCop规则来检查是否存在此构造函数
在等待bug修复之前,如果您想使用声明式方法进行基于声明的授权,您唯一的实际选择是重新实现
ClaimsPrincipalPermission
和ClaimsPrincipalPermissionAttribute
。我通过在类构造函数中使用CheckAccess
调用解决了这个问题:
class SecuredClass
{
public SecuredClass()
{
ClaimsPrincipalPermission.CheckAccess("SecuredClass", "GeneralAccess");
}
[ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "MethodLevelSecuredMethod", Operation = "Call")]
public void MethodLevelSecuredMethod()
{
Console.WriteLine("Called MethodLevelSecuredMethod");
}
}
我尝试了这种变通方法,并遇到了其他问题。调用上述CheckAccess方法并返回false时,在我捕获System.IdentityModel.Services(mscorlib.dll)中的System.Reflection.TargetInvocationException之前抛出了System.Security.SecurityException因此,这使得捕获安全异常变得很困难,因为它是由targetinvocationexception包装的