代码之家  ›  专栏  ›  技术社区  ›  Mike Goodwin

在类级别和方法级别应用ClaimsPrincipalPermissionAttribute时出现异常

  •  2
  • Mike Goodwin  · 技术社区  · 11 年前

    我有一节课,上面装饰着 ClaimsPrincipalPermissionsAttribute 。该类有一个方法,该方法也用 索赔主权限属性 。我所期望的是:

    首先,当我实例化类时,我得到一个对自定义的调用 ClaimsAuthorizationManager 。这符合预期。

    其次,当我调用该方法时,我会得到两个对 索赔授权经理 。一个具有来自类级别属性的Resource和Operation,另一个来自方法级别属性。这行不通。相反,我得到了一个 SecurityException 当我调用该方法时抛出。异常消息为:

    解码嵌入的权限集对象失败。

    为了查看发生了什么,我通过从中复制代码创建了一个自定义属性 索赔主权限属性 我看得出来 CreatePermission() 方法在我的属性上被调用,它成功地返回了ClaimsPrincipalPermission,但在我的 索赔授权经理 被调用。

    我的代码如下所示:

    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。

    2 回复  |  直到 11 年前
        1
  •  3
  •   Nicole Calinoiu    11 年前

    出现问题的原因是 ClaimsPrincipalPermission 不实现接受 PermissionState 论点(这方面的需求记录在 http://msdn.microsoft.com/en-us/library/vstudio/yaah0wb2.aspx 尽管隐藏在文本中间。)

    这本质上是框架中的一个错误,可能应该在 https://connect.microsoft.com/visualstudio/feedback 如果你这样做了,你可能想添加一个FxCop规则来检查这个构造函数的存在可能也是一个好主意。

    在修复错误之前,您唯一真正的选择是重新实现两者 声明主权限 ClaimsPrincipalPermissionAttribute 如果您想使用声明性方法进行基于声明的授权。

        2
  •  0
  •   Steve S    10 年前

    我通过使用 CheckAccess 类构造函数中的调用:

    class SecuredClass
    {
        public SecuredClass()
        {
            ClaimsPrincipalPermission.CheckAccess("SecuredClass", "GeneralAccess");
        }
    
        [ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "MethodLevelSecuredMethod", Operation = "Call")]
        public void MethodLevelSecuredMethod()
        {
            Console.WriteLine("Called MethodLevelSecuredMethod");
        }
    }