2016-06-12 30 views
1

Ich habe AuthActivityAttribute-Klasse. Der Zweck dieser Klasse besteht darin, zu autorisieren, dass der Benutzer berechtigt ist, bestimmte Aktivitäten auszuführen.Benutzerdefinierte Attribute C# funktioniert nicht

Attribut Klasse:

[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 

}

Ich habe ein Konto Controller-Klasse. Alles, was ich brauche, ist Benutzer kann nur registriert werden, wenn er Registrierungsaktivität durchführen darf. Wenn ich jedoch die Anfrage sende, validiert das Attribut nichts. Bitte lass mich wissen, ob ich etwas vermisse oder was?

Klasse

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

zum Beispiel mit dem Attribut dekoriert: Wir setzen die Validierung auf dem Grundstück wie [MaxLength (10)], so bestätigt es, dass die Eigenschaft Länge von weniger als 10 oder Attribut in C# autorisieren müssen . Wie nur Admin kann auf die spezifische Methode zugreifen. Also das ist etwas, was ich erreichen muss

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

Was ich will?

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

Was haben Sie also erwartet, um das Attribut zur Validierung zu verwenden? Was ist 'PlanhayAttributeBase'? –

+0

Liebe @JonSkeet Bitte überprüfen Sie noch einmal ich habe es bearbeitet. –

+0

Nun, Sie haben die Basisklasse geändert. Sie haben immer noch nicht erklärt, warum Sie erwartet haben, dass das Attribut automatisch etwas bewirkt. Attribute machen nicht nur auf magische Weise Code ausgeführt - etwas muss alle relevanten Attribute * finden * und entsprechend handeln. Was erwarten Sie in Ihrem Fall? –

Antwort

0

Wenn Ihr Ziel zu lassen oder den Benutzer nicht ist eine Aufgabe auszuführen, müssen Sie nicht ein benutzerdefiniertes Attribut erstellen, können Sie Autorisieren Attribut, für jede Aktion und geben Sie die Rollen, die erlaubt sind führe diese Aktion aus.

Jede Art und Weise, wenn Sie einige benutzerdefinierte Aufgabe mit einem benutzerdefinierten Attribut ausführen möchten, müssen Sie Reflektion verwenden, um die Aktionen zu erhalten, die das Attribut hat und die Eigenschaften dieses Attribut zu bekommen, wie etwas:

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

Jetzt haben Sie eine Liste aller Aktionen, die mit Ihrem Attribut versehen sind, und Sie können tun, was immer Sie wollen.

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

Jetzt können Sie Benutzerrolle im Vergleich zu dieser Liste überprüfen, aber wie ich schon sagte, Sie brauchen dieses benutzerdefinierte Attribut nicht.

Ich habe diesen Code nur für Sie veröffentlicht, um zu sehen, wie Sie auf das benutzerdefinierte Attribut zugreifen können.