处理自定义属性

时间:2012-09-15 12:27:19

标签: c# asp.net silverlight authorization

我现在有一个自定义属性我不知道如何限制对我已应用我的属性的方法的访问。

例如:如果CustomRole的值为"CustomRole",那么我现在有自定义属性"Admin",然后才能访问方法。

CustomRole["Admin"] 
public void Method()
{
    // code
}

如何执行验证值?

2 个答案:

答案 0 :(得分:0)

这里需要某种aspect oriented programming方法。属性本身无法“访问”该方法,因为它不是由运行时计算的,但您可能会使用一些框架来拦截调用,检查属性和上下文并正确处理大小写。

简而言之,您将:

  • 使用属性
  • 装饰方法
  • 提供拦截来处理呼叫
  • 通过一些提供AOP功能的工具实例化该类
  • 执行通话。电话将根据您的实施情况截获和处理

指定要求

正如您已经指出的那样,可以使用属性轻松指定:

[RequiredPermission(Permissions.CanCreateOrder)]
public virtual Guid CreateOrder(string orderCode) {...}

拦截通话

现在您需要选择一个工具来实例化您的对象并拦截对它的调用。这可以通过支持AOP的IoC容器来完成,也可以手动包装(例如使用AOP工具创建对象的代理并使用代理)。

您需要编写一个拦截器或一个包装器方法,它有机会在将执行转发给您的方法或拒绝该调用之前评估调用上下文。

你可以find a discussion and code samples here。看一下通过属性声明需求的OrderManagementService类。

穷人的AOP

你可以在不使用适当的AOP工具的情况下完成所有这些工作,但是以不太通用的方式(对于更简单的项目来说可能非常好),使用某种形式的Decorator模式 - 请注意,这是从头部编写的,而不是在IDE中:

interface IService 
{
    void Method(); 
}

class ServiceImpl : IService // one of many implementations
{
    [CustomRole("Admin")]
    public void Method() { ... } 
}

class ServiceChecker : IService // one of many implementations
{
    IService m_svc;
    public ServiceChecker(IService wrapped) { m_svc = wrapped; }

    public void Method() 
    {
        var mi = m_svc.GetType().GetMethod("Method");
        if(mi.IsDefined(typeof(CustomRoleAttribute), true)
        {
            CustomRoleAttribute attr =  (CustomRoleAttribute)mi.GetCustomAttributes(typeof(CustomRoleAttribute), true)[0];
            if(!attr.Role.Equals( GetCurrentUserRole() ) // depends on where you get user data from
            {
                throw new SecurityException("Access denied");
            }
        }
        m_svc.Method(); 
    } 
}

// the client code
IService svc = new ServiceChecker(new ServiceImpl());
svc.Method();

答案 1 :(得分:0)

您的代码看起来有点不对劲。 这是我的班级,其方法为CustomRoleAttribute

public class MyClass
{
      [CustomRole("Admin")]
      public void MyMethod()
      {


      }
}

您的属性应该定义AttributeUsage以确保其他开发人员不在属性或构造函数上使用您的属性:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false,Inherited = true)]
public class CustomRoleAttribute : Attribute
{
        public string Role { get; private set; }

        public CustomRoleAttribute(string role)
        {
            Role = role;
        }
}

现在把它们放在一起:

MyClass myClass = new MyClass();
MethodInfo[] methods =  myClass.GetType().GetMethods(); // Access all the public methods.

        foreach (var methodInfo in methods) // iterate trough all methods.
        {

             // Get all custom attributes from the method.
             object[] attributes =  methodInfo.GetCustomAttributes(typeof (CustomRoleAttribute), true); 

            if (attributes.Length > 0)
            {
                CustomRoleAttribute attribute = (CustomRoleAttribute)attributes[0];
                if (attribute.Role == "Admin")
                {
                     // the role is admin
                }
             }
        }

您现在看到,如何使用属性。你必须首先检查属性,然后才能访问该方法。