2016-06-12 77 views
1

我有AuthActivityAttribute类。这个类的目的是授权用户有权执行特定的活动。自定义属性C#不工作

属性类:

[AttributeUsage(AttributeTargets.All)] 

public class AuthActivityAttribute : Attribute 

{ 
#region Properties 

public string ActivityName { get; set; } 

#endregion 

#region Constructor 

public AuthActivityAttribute() 
{ 

} 

#endregion 

#region MemberFunctions 

private List<aspnetactivities> GetUserActivities(ApplicationUser currentUser) 
{ 
    IList<string> roles = DALAccessObjectObj.UserDALObj.GetUserRoles(currentUser); 
    List<aspnetactivities> lstAspnetActivites = new List<aspnetactivities>(); 
    foreach (string role in roles) 
    { 
     List<aspnetactivities> activities = DALAccessObjectObj.UserDALObj.GetRoleActivity(role); 
     lstAspnetActivites.AddRange(activities); 
    } 

    return lstAspnetActivites; 
} 
public void ValidateUserActivity() 
{    
    DALAccessObjectObj.UserDALObj = new UserDAL(); 
    ApplicationUser currentUser = DALAccessObjectObj.UserDALObj.GetUserById(HttpContext.Current.User.Identity.GetUserId()); 
    if (GetUserActivities(currentUser).Where(r => r.ActivityName.Equals(ActivityName, StringComparison.InvariantCultureIgnoreCase) 
      ).Select(r => r).Count() > 0) 
    { 
     throw new Exception(string.Format("User is not allowed to perform activity named : {0}", ActivityName)); 
    } 

} 

#endregion 

}

我有一个帐户控制器类。我所需要的只是如果允许他进行注册活动,用户只能注册。但是,当我发送请求的属性不验证任何事情。请让我知道我错过了什么或什么?

类装饰有属性

public class AccountController : BaseApiController 
    { 
     [AuthActivityAttribute(ActivityName = "Register")] 
     public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
     { 
      // do something ... 
     } 
    } 

例如:我们把验证像属性[的MaxLength(10)],以便它验证该属性的长度必须小于10或授权在C#属性。就像只有管理员可以访问特定的方法。所以这是我需要实现的东西

[Authorize("Administrator")] 
public void DeleteUser() 
{ 
// do something 
} 

我想要什么?

[AuthActivity("DeleteUser")] 
public void DeleteUser() 
{ 
// do something 
} 
+0

那么你期望使用该属性来执行验证?什么是'PlanhayAttributeBase'? –

+0

亲爱的@JonSkeet请再次检查我编辑它。 –

+0

那么,你已经改变了基类。您仍然没有解释为什么您期望该属性自动执行某些操作。属性不会神奇地让代码执行 - 某些事物必须*找到*所有相关的属性并相应地采取行动。你希望在你的情况下做什么? –

回答

0

如果你的目标是让与否用户执行一个任务,你并不需要创建一个自定义属性,您可以使用授权属性,每一个动作,并指定允许的角色执行该操作。

任何方式,如果你想使用自定义属性来执行一些自定义任务,必须使用反射来获取具有该属性的行动,并获得该属性的属性,是这样的:

public static class CustomAttrr 
{ 
    public static IEnumerable<ActionsWithAuthActivityAttribute> GetItems(Assembly types) 
    { 
     var model = from type in types.GetTypes() 
        from methodInfo in type.GetMethods().Where(x => x.GetCustomAttributes<AuthActivityAttribute>().Any()) 
        from attribute in methodInfo.GetCustomAttributes() 
        where attribute is AuthActivityAttribute 
        let a = attribute as AuthActivityAttribute 
        select new ActionsWithAuthActivityAttribute 
        { 
         ActionName = methodInfo.Name, 
         ActivityName = a.ActivityName, 
        }; 
     return model.ToList(); 
    } 
} 

public class AuthActivityAttribute:Attribute 
{ 
    public string ActivityName { get; set; } 
} 

public class ActionsWithAuthActivityAttribute 
{ 
    public string ActionName { get; set; } 
    public string ActivityName { get; set; } 
} 

现在,您已经列出了用您的属性装饰的所有操作,并且您可以做任何您想要的操作。

var listAction = CustomAttrr.GetItems(Assembly.GetExecutingAssembly()); 
    var listActionsRegister = listAction.Where(x => x.ActivityName.Equals("Register")); 

现在您可以检查用户角色与此列表,但正如我所说的,您不需要此自定义属性。

我只发布了此代码,供您了解如何访问自定义属性。