2016-06-12 4 views
1

J'ai la classe AuthActivityAttribute. Le but de cette classe est d'autoriser l'utilisateur à effectuer une activité spécifique.Attributs personnalisés C# ne fonctionne pas

Attribut Classe:

[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 

}

J'ai une classe de contrôleur de compte. Tout ce dont j'ai besoin, c'est que l'utilisateur ne peut être enregistré que s'il est autorisé à effectuer une activité d'enregistrement. Cependant, lorsque j'envoie la requête, l'attribut ne valide rien. S'il vous plaît laissez-moi savoir est-ce que je manque quelque chose ou quoi?

classe décorée avec l'attribut

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

par exemple: nous avons mis la validation sur la propriété comme [MaxLength (10)] pour valider que la propriété doit avoir une longueur inférieure à 10 ou Autorisez attribut en C# . comme seul administrateur peut accéder à la méthode spécifique. Donc c'est quelque chose que je dois réaliser

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

Qu'est-ce que je veux?

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

Alors, qu'espériez-vous utiliser l'attribut pour effectuer la validation? Qu'est-ce que 'PlanhayAttributeBase'? –

+0

chère @JonSkeet s'il vous plaît vérifier à nouveau je l'ai édité. –

+0

Eh bien, vous avez changé la classe de base. Vous n'avez toujours pas expliqué pourquoi vous vous attendiez à ce que l'attribut fasse automatiquement quelque chose. Les attributs ne font pas simplement magiquement exécuter le code - quelque chose doit * trouver * tous les attributs pertinents et agir en conséquence. Que comptez-vous faire dans votre cas? –

Répondre

0

Si votre objectif est de laisser ou non l'utilisateur d'effectuer une tâche, vous n'avez pas besoin de créer un attribut personnalisé, vous pouvez utiliser l'attribut Autorisez, pour chaque action et préciser les rôles qui sont autorisés à exécuter cette action.

De toute façon, si vous voulez effectuer une tâche personnalisée à l'aide d'un attribut personnalisé, vous devez utiliser la réflexion pour obtenir les actions qui a cet attribut et pour obtenir les propriétés de cet attribut, quelque chose comme:

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; } 
} 

Maintenant, vous avez une liste de toutes les actions décorées avec votre attribut, et vous pouvez faire ce que vous voulez. Maintenant, vous pouvez vérifier le rôle de l'utilisateur par rapport à cette liste, mais comme je l'ai dit, vous n'avez pas besoin de cet attribut personnalisé.

J'ai posté ce code uniquement pour que vous voyiez comment accéder à l'attribut personnalisé.