Autorisations / bon modèle / modèle pour l'application .NET

9

J'ai besoin de mettre en œuvre flexible ET simple (si une telle chose existe) et en même temps utiliser des moyens intégrés si possible

Jusqu'à présent, j'ai mis en place MembershipProvider et RoleProviders. C'est cool mais où dois-je aller ensuite?

Je sens que j'ai besoin d'ajouter le terme "Privilège" et de coder en dur ceux de l'application. Les utilisateurs configureront des rôles pour ajouter des privilèges aux rôles et attribuer des rôles aux utilisateurs.

Est-ce que cela ressemble à un bon modèle? Dois-je penser à ajouter des privilèges au niveau de l'utilisateur en plus de les ajouter aux rôles? Je pourrais mais j'envisage des problèmes avec la configuration (confuse) et le support suivant.

Si je ne le fais pas et que certains utilisateurs spécifiques auront besoin de privilèges moindres - l'administrateur devra créer un autre rôle, etc.

Une solution miracle pour un système comme celui-ci? Et pourquoi Microsoft n'est pas allé plus loin que les fournisseurs d'adhésion et de rôle?

Autre idée: laisser les rôles en tant que détenteurs de "privilèges" et les coder en dur. Ensuite, je peux coder pour ces rôles dans l'application en utilisant toutes les balises / attributs disponibles, etc. - tous Microsoft.

Ajouter une nouvelle entité "Groupe" et créer une relation comme celle-ci

  • Utilisateurs
  • Groupes d'utilisateurs
  • Groupes
  • Groupes de rôles
  • Les rôles

De cette façon, je peux collecter des rôles en groupes et affecter ces groupes aux utilisateurs. Sonne bien et correspond à d'autres modèles de logiciels. Mais je ne peux pas vraiment implémenter des choses dans RoleProvider comme:

  • AddUsersToRoles
  • RemoveUsersFromRoles

Et certaines choses n'ont plus vraiment de sens car elles seront codées en dur

  • DeleteRole
  • CreateRole
Katit
la source

Réponses:

5

Si l'autorisation basée sur les rôles n'est pas assez granulaire pour vous, envisagez d'utiliser l' autorisation basée sur les revendications .

Une revendication décrit une ressource et une activité - un peu comme une entrée dans une ACL, mais plus flexible, parce que la "ressource" ne doit pas être un objet physique, elle peut être tout ce que vous voulez qu'elle puisse contenir et peut contenir n'importe quelle information tu veux.

Dans ce modèle, une revendication équivaut à ce que vous appelez un "privilège" et vous regroupez les revendications en ensembles de revendications, ce qui est à peu près équivalent à ce que vous appelez un "rôle". Toutes ces API et plus sont déjà dans l' System.IdentityModelespace de noms.

Bien sûr, vous mentionnez MembershipProvideret RoleProvideret si vous essayez de mettre tout cela dans le modèle d'appartenance ASP.NET (comme ces noms l'indiquent), alors oubliez-le. Si vous souhaitez utiliser ces API de fournisseur, vous devez le faire à leur manière, et leur manière n'est pas plus précise que le concept de rôle.

Au lieu de cela, dans ASP.NET, le concept d'un «privilège» est réellement codé au niveau de l' action ou de l' opération , où vous déclarez quels rôles sont autorisés à exécuter cette action. C'est vraiment beaucoup plus facile à gérer dans ASP.NET MVC où vous claquez simplement un [AuthorizeAttribute]sur des contrôleurs ou des actions de contrôleur; dans ASP.NET "old-school", vous gérez des événements, donc l'autorisation a tendance à être soit ad-hoc soit au niveau de la page (ou les deux).

Aaronaught
la source
Beaucoup de bonnes informations, merci! L'application est en fait une application Silverlight avec une partie du serveur exposée en tant que service WCF RESTful. Basé sur les revendications semble intéressant, mais je n'ai pas remarqué de concept d'utilisateur et d'autorisation à l'intérieur. Article intéressant que je viens de trouver: geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx
katit
@katit: La quasi - totalité d' authentification / autorisation .NET est basée sur l' interface de IPrincipal . Si vous faites une autorisation basée sur les revendications, vous utilisez un IClaimsPrincipal pour cela, et jette l' IPrincipalà IClaimsPrincipalquand vous voulez faire des vérifications de réclamation. Vous écrirez beaucoup de votre propre code si vous souhaitez l'intégrer avec (par exemple) l'authentification par formulaire, mais cela peut évidemment être fait (selon le lien).
Aaronaught
la question est ... Peut-être est-il plus facile d'ajouter simplement un autre niveau "Groupe" aux fournisseurs de membres / rôles ou d'écrire son propre fournisseur? Quasiment même quantité de travail que la mise en œuvre les Microsoft
Katit
3
@katit: Derniers mots célèbres. N'inventez pas la vôtre à moins d'avoir une très bonne raison d'inventer la vôtre ("cela semble plus facile" n'est pas une bonne raison; cela ne semble plus facile que si vous n'avez aucune expérience directe et n'avez donc pas la capacité de juger quantité de travail requise).
Aaronaught