2010-03-16 2 views
4

Mon site Web a l'authentification des formulaires, et tout va bien. Maintenant, je veux créer un sous-répertoire et l'avoir également protégé par mot de passe, mais! J'ai besoin du sous-répertoire pour utiliser un ensemble de logins/mots de passe complètement différent de celui utilisé par l'ensemble du site. Par exemple, j'ai des utilisateurs pour le site Web stockés dans la table "Users" dans une base de données. Mais pour le sous-répertoire, je veux que les utilisateurs soient tirés de la table "SubdirUsers". Qui a probablement une structure complètement différente.Formulaires Auth: ont des informations d'identification différentes pour un sous-répertoire?

Par conséquent, j'ai besoin les connexions pour être complètement parallèle, comme dans:

  1. Connexion à tout le site ne vous rend pas connecté dans le sous-répertoire et
  2. cliquant sur « Déconnexion » sur tout le site ne supprime pas votre connexion dans le sous-répertoire
  3. Et vice versa

Je ne veux créer un v séparé application logique pour le sous-répertoire, car je veux partager toutes les bibliothèques, les contrôles utilisateur, ainsi que l'état de l'application et le cache. En d'autres termes, il doit s'agir de la même application.

Je ne veux pas voulez juste ajouter un drapeau à la "Users" table indiquant s'il s'agit d'un utilisateur du site Web entier ou l'utilisateur du sous-répertoire. Les listes d'utilisateurs doivent provenir de différentes sources.

Pour l'instant, la seule option que je vois est de rouler mon propre formulaire d'authentification pour le sous-répertoire.

Quelqu'un peut-il proposer une meilleure alternative?

+0

Pourquoi avez-vous besoin que la liste d'utilisateurs figure dans des tables séparées? Si vous les stockez dans un seul et que vous utilisez des rôles, vous pouvez implémenter un rôle personnalisé et un fournisseur d'appartenances et en finir avec lui. Avoir 1 rôle pour le site principal et un autre pour le sous-répertoire. –

+0

Les tableaux étaient à titre d'illustration seulement. En réalité, il peut s'agir d'Active Directory, ou d'un fichier texte, ou d'une liste codée en dur, ou d'une liste reçue d'un autre service, et ainsi de suite. Ils ont juste besoin de provenir de deux sources différentes. Période. –

+0

Vous avez été assez agressif envers tous ceux qui essaient de vous aider à y réfléchir - s'il y a une réponse, la personne qui la connaît peut lire vos autres réponses et décider de passer du temps à aider les autres. –

Répondre

0

Vous ne pourrez simplement y parvenir qu'avec FormsAuthentication.

Ce scénario de problème est le candidat idéal pour l'utilisation de HttpModules. HttpModules peut intercepter le pipeline de demande et de réponse. Vous devrez écrire 2 HttpModules.

  1. HttpModule pour l'authentification
  2. HttpModule pour l'autorisation

Vous pouvez fusionner ces modules dans une suite une fois que votre solution atteint dans un état stable et que vous êtes assez en mesure de gérer la complexité.

Dans votre solution, vous devez disposer d'un mécanisme de base de données qui stocke le sous-répertoire et les données d'autorisation utilisateur et de mappage d'authentification. Votre HttpModules peut lire ces données prendre une décision sur l'utilisateur demandeur.

Vous pouvez commencer à here.

+1

J'ai mentionné dans la question que "la seule option que je peux voir est de rouler mon propre formulaire d'authentification pour le sous-répertoire". Mais la question était de savoir s'il y avait de meilleures alternatives. –

1

Je pense que vous pouvez utiliser ce code pour valider l'utilisateur avec un fournisseur

if (Membership.Providers["myprovider"].ValidateUser("USER", "PWD")) { 

    //your code 

} 
+0

Je ne vois pas exactement comment ce code peut m'aider. Est-ce que je manque quelque chose? –

+0

Le code vous aide à utiliser plusieurs fournisseurs d'authentification dans asp.net – Hameds

+0

En fait, tout ce que vous devez faire est d'implémenter deux fournisseurs d'appartenances, vous pouvez utiliser le code ci-dessus pour authentifier les utilisateurs – Hameds

1

Vous pouvez avoir un web distinct.fichier de configuration dans le sous-dossier qui inclut uniquement les paramètres de validation pour ce sous-dossier. Notez que vous devez supprimer tous les autres paramètres, car certains paramètres ne peuvent être définis qu'au niveau de l'application.

<authorization configSource="alterativeSource.xml"/> 
+0

Vous ne pouvez pas utiliser la balise dans un web.config ce n'est pas au niveau de l'application. –

+0

Mais vous pouvez utiliser la balise '', qui est celle qui sert à définir les utilisateurs. – awe

+0

Alors? Comment cela m'aide-t-il? –

0

Je pouvais voir une meilleure réponse si vos utilisateurs sont dans le fichier web.config, mais puisque vous utilisez les utilisateurs dans une base de données que vous êtes à peu près devoir utiliser quelque chose en plus des formes d'authentification. Vous devrez définir le sous-répertoire pour autoriser tous les utilisateurs et ensuite reconstruire les formulaires Authentification avec des sessions. Vous pouvez créer une sous-classe de la classe de page et l'utiliser pour conserver toutes vos routines pour s'authentifier et rediriger. Ensuite, vous n'aurez pas besoin d'ajouter quoi que ce soit à chaque page du sous-répertoire.

Je sais que c'est la réponse que vous espériez probablement éviter mais l'authentification par formulaire est une solution trop simple pour ce genre de situation compliquée.

+0

Oui, vous avez raison, je veux éviter de réinventer Forms Auth, et je l'ai clairement indiqué dans la question. –

0

Habituellement, "autorisation" est utilisé après la connexion pour déterminer quels répertoires, ressources, etc. peuvent être utilisés par l'utilisateur donné.

Avez-vous envisagé de créer un rôle pour le répertoire "principal" et un second rôle pour le répertoire "sub", puis d'appliquer la balise d'autorisation (c'est-à-dire dans le fichier web.config)? Vous devrez implémenter un fournisseur d'autorisation, mais cela semble être une meilleure solution à long terme que d'avoir plusieurs tables utilisateur. Quelle que soit l'autorisation (vérification d'identité ou mot de passe, etc.), vous devez toujours définir les rôles d'utilisateur quelque part, donc, pour les besoins de l'argument, supposons une "table utilisateur". (Rien ne l'empêche d'être un fichier XML dans un stockage isolé si vous le souhaitez.) NBPeu importe que les utilisateurs proviennent de sources différentes. Cela devrait être reflété dans le schéma pour la table utilisateur (c'est-à-dire un drapeau ou une autre colonne, etc.). Si vous combattez ce schéma commun, vous finirez probablement par faire plus de travail à long terme.

Quand il y a une exception, il est susceptible d'être une autre dans le futur ....

+0

Je pense que j'ai été assez clair dans la question que les utilisateurs DOIVENT provenir de différentes sources. Je n'ai donné que la base de données comme exemple. En réalité, il pourrait s'agir d'Active Directory, ou d'une liste d'utilisateurs codés en dur, ou d'une liste intégrée dans web.config ... Et ainsi de suite. J'ai besoin d'une solution où les utilisateurs viennent de différentes sources. C'est tout. –

+0

Si vous avez besoin de garder cela comme 1 application, je pense que vous avez seulement une option. Cela ne change pas ma réponse. Notez que votre module d'autorisation personnalisé peut authentifier les utilisateurs selon la logique que vous souhaitez, c'est-à-dire en utilisant différentes sources. Vous pouvez baser cela sur la requête entrante Url ... pour déterminer quelle source utiliser. Ensuite, il vous suffit d'empêcher l'utilisateur d'utiliser des pages auxquelles il n'est pas autorisé, vous aurez donc besoin d'un module d'autorisation personnalisé. –

+0

Ce que vous décrivez maintenant, c'est exactement la solution «rouler le mien», ce que, comme je l'ai dit dans la question, je me vois et que je veux éviter. –

0

Cela peut vous aider - numina.codeplex.com

+0

Que vous pour le pointeur, je vais essayer de regarder dans cela. –

0

Je n'ai pas essayé, mais je pense que cela fonctionnerait .

Vous pouvez avoir deux fournisseurs d'adhésion (à savoir, ASPNETDB_1 et ASPNETDB_2.)

Elles sont spécifiées dans la section des fournisseurs de membres du web.config. Vous avez donc besoin d'un fichier web.config distinct dans chaque sous-répertoire, ce que je sais que vous pouvez faire.

À la racine du site, je suppose que vous n'auriez pas d'authentification par formulaire. Vous pourriez avoir juste une page de démarrage qui demande à l'utilisateur de choisir quel sous-répertoire (ou vous pouvez simplement utiliser des sous-domaines (firstdir.monsite.com, secondir.mysite.com) ou http: /monsite.com/firstdirectory ou http:/monsite. com/secondirectory.

Je ne suis pas sûr de l'avantage de cette méthode sur les répertoires virtuels, bien que, à l'exception que la racine peut contenir des programmes ASP qui ne nécessitent pas d'authentification.

Je comprends que vous recherchez une solution «prête à l'emploi» et ne veut pas «rouler la vôtre» Cependant, le fournisseur d'adhésion standard vous permet d'établir un profil pour chaque utilisateur - alors il est vraiment facile de configurer un formulaire de maintenance d'un utilisateur avec une liste pour chacune des fonctions de maintenance de vos utilisateurs séparés et un filtre par rôle ou par valeur de profil (e. g., identifiant organisationnel).En utilisant les classes de fournisseurs d'appartenances, j'ai personnellement trouvé cela très facile à faire (peut-être une heure de création de formulaires maintenane si vous utilisez tous les contrôles glisser/déposer, SqlDatasource + listview - pas de codage VB ou C requis). Mais, les fournisseurs distincts et les webconfigs feraient aussi l'affaire.

+0

Cela ressemble très près à ce que je cherche. Je vais regarder dedans. Merci beaucoup. –

Questions connexes