2011-04-28 8 views
3

J'essaie d'utiliser des attributs personnalisés pour implémenter des autorisations d'autorisation pour exécuter une méthode. Voici ce que j'ai en ce moment (je viens juste de commencer sur les attributs personnalisés):Autorisation de niveau de méthode d'attribut personnalisé

[RequiredUserPermissions(UserPermissions.CanLoginViaSite)] 
internal static bool HasDesiredPermissions() 
{ 
    //Execute body here if the attribute decorated permissions exist 
    //for current user tracked as this._user (with permissions as 
    //this._user.UserPermissions (of type UserPermissions (an enum)) 
} 

//Custom attribute class 
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] 
internal sealed class RequiredUserPermissionsAttribute : Attribute 
{ 
    private readonly UserPermissions _requiredPermission; 

    public RequiredUserPermissionsAttribute(UserPermissions requiredPermission) 
    { this._requiredPermission = requiredPermission; } 

    public UserPermissions RequiredPermissions 
    { get { return _requiredPermission; } } 
} 

la plus proche question que j'ai trouvé sur stackoverflow est Using an attribute to prematurely return from a method. La réponse aurait été parfaite si j'utilisais asp.net mvc framework mais malheureusement je suis dans un WCF Service en ce moment et implémenter toute la couche Authorization au-delà de la simple connexion à la base de données que j'ai actuellement (via un appel à la méthode WCF) n'est pas faisable dès maintenant du point de vue du calendrier.

Je crois que PostSharp est probablement la meilleure option, mais encore une fois pas une option faisable pour le moment. Suis-je coincé ici? Est-ce que je devrais juste revenir à faire ceci par des méthodes qui prennent enum et retournent bool. Je suis heureux d'apprendre des choses détaillées/complexes si cela me permet d'implémenter cette fonctionnalité à travers des attaches personnalisées.

Toute aide avec comment je peux y arriver sera très appréciée.

Répondre

2

Je ne sais pas si cela pourrait s'appliquer à votre cas, mais si vous écrivez un service WCF, pourquoi n'utilisez-vous pas l'autorisation de base de rôle directement à partir du framework? Il s'agit d'un rôle ou d'une revendication, et pour les cas les plus simples, vous pouvez le définir au moyen d'attributs. Les rôles peuvent être définis via un Custom Principal ou simplement en utilisant les fournisseurs de rôles standard définis dans le framework.

[PrincipalPermission(SecurityAction.Demand, Role = 'LoginViaSiteVisitors')] 
internal static bool HasDesiredPermissions() 
{ 
    //.... 
} 
+0

En raison de la façon dont sa configuration en ce moment, l'utilisateur connecté par cadre est soit inexistant (le service en cours d'exécution en mode anonyme) ou un utilisateur différent de celui qui sera fait dans l'exploitation forestière par Service.LoginUser() méthode (sur qui ces autorisations doivent agir) - Mais merci pour l'entrée :) – Maverik

+0

Ne pouvez-vous pas définir votre principal dans Service.LoginUser() et le définir comme le principal actuel? Quelque chose comme 'Thread.CurrentPrincipal = new GenericPrincipal (new GenericIdentity (utilisateur, mot de passe), rôles);'? Je pense que cela pourrait fonctionner. – LazyOfT

+0

Hmm, je n'y ai pas pensé. Je suis sur le point de quitter le bureau maintenant, mais quand je reviendrai lundi, j'essaierai d'y aller comme ça. Je reviendrai après que j'aurai essayé. Merci beaucoup pour l'idée. – Maverik

Questions connexes