2010-01-14 16 views
2

L'application en question est assez étendue avec de nombreux types de rôles d'accès différents (lire Customer Service, HR, Admins, etc etc). Accès hiérarchisé, de sorte que chaque rôle hérite de l'accès en dessous, de sorte que HR est en lecture seule, CS a des capacités d'édition, un contrôle total des administrateurs. Les barres de menus et les boutons activent/les attributs visibles sont contrôlés par une bibliothèque extérieure et externe qui gère tous les accès basés sur les rôles via la réflexion. L'homme qui a écrit ceci était un génie diabolique. Cela étant dit, je voudrais éventuellement l'enlever. La base de connaissances sur son fonctionnement est partie avec lui il y a des années, et le développement de cette application commence à stagner puisque la documentation sur la 'suite' de sécurité est horrible. Tout est stocké dans une base de données, pour marquer la visibilité de chaque étiquette. C'est un peu exagéré et pas facile à refactoriser.Utilisation des principes/rôles Windows pour contrôler par programme l'accès aux contrôles/formulaires - C#

J'ai passé beaucoup de temps à étudier la sécurité des formulaires Windows. Nous exécutons nos propres utilisateurs/rôles pour cette application plutôt qu'Active Directory. J'aimerais utiliser User/Principal, car cela semble être la meilleure option. S'il y a une autre option, je suis ouvert à des conseils, j'aimerais que cela soit fait de la bonne façon puisque nous envisageons une réécriture complète (sans rapport avec cela). Toutes les recherches que j'ai effectuées via MSDN et d'autres sites m'ont amené à croire que je ne peux contrôler que les flux et les méthodes basés sur les rôles, pas aussi granulaire que "activer ce bouton" ou "masquer cette barre de menu "

Y at-il une meilleure façon de faire quelque chose le long des lignes de:

btnA.Visible = Thread.CurrentPrincipal.IsInRole("HR"); 
btnA.Enabled = Thread.CurrentPrincipal.IsInRole("CS") || 
    Thread.CurrentPrincipal.IsInRole("ADMIN"); 

est-il une meilleure façon en général? Quelle est la meilleure façon de gérer cela?

Répondre

0

C'est très proche de la façon dont nous le faisons, à la fois dans WinForms et dans nos applications ASP.net. La seule différence est que nous stockons les noms de rôle dans une base de données afin qu'ils soient plus faciles à maintenir et à mettre à jour que les constantes codées en dur.

Bien qu'il manque la sex-appeal d'une sorte de reliure automatique (ce que vous semblez rechercher), il est solide et n'a pas été difficile à traiter. Cependant, notre application n'a pas une variation énorme entre les utilisateurs. Pour la plupart, si un utilisateur peut accéder à une partie de l'application, il peut effectuer la plupart des actions.

+0

Je comprends le stockage des noms de rôle dans une base de données, mais comment les utiliseriez-vous sans utiliser de constantes codées en dur? La seule façon que j'imagine en ce moment est de stocker les constantes dans une classe de rôles statique, était-ce cela que vous vouliez dire? – StyxRiver

+0

C'est exactement ça. Désolé, je n'étais pas clair. –

+0

Merci beaucoup! Ce n'est peut-être pas sexy, mais ça va marcher, et c'est quelque chose que je ne peux pas dire plus longtemps avec notre implémentation actuelle! – StyxRiver