Question

Je suis système d'application qui utilise l'accès à base de rôle à différentes méthodes dans les classes. Par exemple, pour effectuer une action que je dois vérifier si l'utilisateur qui l'utilise peut le faire.

Je peux écrire dans chaque méthode:

if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}

Je pensais à l'automatisation de ce processus, par exemple en ajoutant des attributs à ces méthodes ou peut-être une autre solution?

Était-ce utile?

La solution

Jetez un oeil à « Programmation Orientée Aspect » (AOP) bibliothèques - et les réponses aux cette question StackOverflow. Vous pouvez utiliser AOP pour ajouter le code de vérification de rôle automatiquement.

Autres conseils

Tant que vous utilisez les directeurs des choses sont déjà là ...

[PrincipalPermission(SecurityAction.Demand, Role = "A role available on your principal")]
public void Foo()
{
  // Will throw an exception if the principal does not have the required role
  // Otherwise the method will execute normally
}

Faites la vérification une fois au moment de la construction, et lancer (ou NULL de retour de l'usine) si les conditions de sécurité ne sont pas respectées. Par la suite, la tenue d'une référence à un objet de modèle donné est une preuve suffisante que vous avez passé le contrôle de sécurité à un moment donné plus tôt. Si vous craignez que cela pourrait causer TOCTTOU questions, assurez-vous que ces objets deviennent inutilisables à la fin d'un concept défini par l'application de « tour de jeu » (généralement la transaction de base de données); c'est une bonne pratique de toute façon.

Cette approche de la sécurité est appelée de href="http://en.wikipedia.org/wiki/Capability-based_security". Pensez à vos objets comme des boîtes qui ont une certaine autorité dans les (dans leurs variables privées). En appuyant sur les boutons de la boîte, vous ne pouvez exercer une fraction sur mesure vers le bas de cette autorité de la manière que le programmeur de l'objet vous permet de.

Par exemple, supposons que vous écrivez une application de calendrier avec un backend SQL. Il est l'objet SQLTransaction, qui ne survivra la transaction (comme ci-dessus), mais encore il a tous les droits sur toutes les tables que l'application utilise. Cela fait beaucoup de pouvoir que vous ne voulez pas être passe autour aux utilisateurs de votre API (explicitement ou par erreur, pensez injection SQL). Au lieu de cela vous distribuez des objets User ce modèle le pouvoir d'écrire uniquement à la ligne de l'utilisateur dans la table des utilisateurs; aussi User peut créer, lire, mettre à jour des objets de suppression de Appointment, qui représentent de la même autorité limitée dans le tableau des nominations.

Pour maintenir votre API RBAC à travers, vous devez vous assurer que la prise suivante:

  1. Seuls les utilisateurs légitimes peuvent avoir accès à l'objet User qui les représente. C'est là que vous câbler le système d'authentification dans le constructeur de User;
  2. Les objets User ne , à savoir que vous devez auditer votre API pour vous assurer que l'exercice par les appels de méthode sur un User (ou tout autre objet lié leur retour, récursive) vous ne pouvez pas lire ou modifier les ressources qui ne appartiennent à cet utilisateur. C'est là que vous pouvez appliquer la facette modèle - par exemple User.GetAppointments() rendement réel des instances de Appointment pour rendez-vous créés par cet utilisateur, mais en lecture seule pour les emballages ceux créés par quelqu'un d'autre.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top