2010-03-12 14 views
3

J'ai plusieurs pages ou vues dans mon application qui sont essentiellement les mêmes pour les utilisateurs authentifiés et les utilisateurs anonymes. Je souhaite limiter les actions d'insertion/de mise à jour/suppression dans les vues de formulaire et de grille aux utilisateurs authentifiés uniquement, et autoriser l'accès en lecture pour les utilisateurs authentifiés et anonymes. J'utilise le système de configuration asp.net pour gérer l'authentification et les rôles. Ce système limite l'accès en fonction du chemin, donc j'ai créé des pages en double pour les chemins authed et anon. La solution qui vient immédiatement à l'esprit est de vérifier les rôles dans les gestionnaires d'événements appropriés, de limiter les actions possibles (insertion/mise à jour/suppression) et de limiter les actions effectuées (pour les utilisateurs qui savent effectuer une action en l'absence d'un bouton.) Cependant, cette solution n'élimine pas la duplication - je dupliquerais le code de sécurité sur une série de pages plutôt que de dupliquer des pages et de limiter l'accès en fonction du chemin; ce dernier serait nettement moins compliqué.Comment limiter les actions de contrôle d'asp.net en fonction du rôle de l'utilisateur?

Je pourrais toujours construire des contrôles qui offrent une configuration basée sur les rôles, mais je ne pense pas avoir le temps pour ce genre d'engagement en ce moment.

Y a-t-il un moyen relativement simple de le faire (existe-t-il de tels contrôles?) Ou devrais-je m'en tenir à l'accès basé sur le chemin et aux pages en double?

Est-il même logique d'utiliser deux méthodes d'autorisation? Il y a encore quelques pages qui sont strictement pour l'un ou l'autre rôle donc je vais utiliser l'autorisation basée sur le chemin de toute façon.

Enfin, l'utilisation de quelque chose d'autre que l'autorisation basée sur le chemin serait-elle contraire aux pratiques de conception typiques d'asp.net, au moins dans le contexte de l'utilisation du système de configuration asp.net?

Répondre

3

La meilleure approche sera d'ajouter une propriété sur un contrôle personnalisé disant rôles ou quelque chose qui permettra aux utilisateurs de ces rôles pour voir le contrôle.Depuis, vous n'avez pas le temps de faire une méthode d'assistance qui s'occupera de la propriété visible du contrôle. Quelque chose comme ceci:

<asp:Button id="UpdateButton" runat="server" Visible="<%# IsInRole("Admin") %>" /> 

Vous pouvez également faire votre propre méthode d'assistance qui vérifie plusieurs critères.

+0

La raison pour laquelle je dis que je n'ai pas le temps est que je voudrais faire un contrôle personnalisé «universel» avec des choses comme une balise intelligente afin que je puisse spécifier différentes sources de données lors de l'utilisation du contrôle sur di pages différentes. Je suis relativement nouveau sur asp.net et à première vue ça a l'air un peu compliqué. J'aime votre solution pour définir la visibilité du contrôle; semble assez simple! – Matt

+0

Je dois utiliser Visible = '<% # user.IsInRole ("Admin")%>' afin de le faire fonctionner ... – DavRob60

+0

@ DavRob60 Yup! ça devrait le faire! – azamsharp

0

Une solution consisterait à écrire quelques procédures stockées personnalisées du côté de la base de données. Si vous avez passé un indicateur booléen pour l'authentification par rapport à non autorisé, votre code SQL peut gérer les résultats renvoyés et les actions effectuées. Toutefois, si vous pensez que beaucoup de vos utilisateurs ne sont pas autorisés, vous devriez peut-être utiliser l'état de la session pour vérifier le rôle d'un utilisateur, avant de faire mille appels dans votre base de données. Fondamentalement, vous devez "lier conditionnellement" votre grille à sa source de données, en déterminant quelle procédure stockée appeler en vérifiant le rôle de l'utilisateur.

J'espère que cela aide un peu!

2

Pour afficher les contrôles, vous pouvez utiliser asp: LoginView.

http://www.codedigest.com/Articles/ASPNET/78_LoginView_Controls_with_Roles_in_ASPNet_20.aspx

pour « les utilisateurs qui peuvent savoir comment effectuer une action en l'absence d'un bouton »,

vous pouvez utiliser if User.IsInRole("Role_name") then ... avant de faire vos trucs de mise à jour. vous pouvez aussi ajouter de la sécurité à la fonction en utilisant:

<PrincipalPermission(SecurityAction.Demand, role:="Role_name")> _

http://www.4guysfromrolla.com/webtech/121901-1.2.shtml