2016-06-12 74 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")); 

現在您可以檢查用戶角色與此列表,但正如我所說的,您不需要此自定義屬性。

我只發佈了此代碼,供您瞭解如何訪問自定義屬性。