Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在类级别和方法级别应用ClaimsPrincipPermissionAttribute时发生异常_C#_.net_Wif_Claims Based Identity_Code Access Security - Fatal编程技术网

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包装的