2009-12-14 6 views
4

Je suis nouveau sur asp.net mvc et je démarre le projet suivant. La société souhaite qu'un site Web intra-net pour différents groupes de personnes télécharge des fichiers dans une base de données, exécute des rapports à partir de ceux-ci et modifie les données de plusieurs tables principales dans la base de données. L'entreprise utilise Active Directory et ne souhaite pas que les utilisateurs se reconnectent pour utiliser le site Web. Le site Web aura différentes sections pour différents groupes et l'accès de l'utilisateur à une page particulière devrait être contrôlé à partir d'une base de données.asp.net mvc utilisateur authentification/permission

Jusqu'à présent, ce que je suis venu avec

  1. changé le fournisseur d'appartenances pour créer un lien vers le serveur d'annuaire actif (based on Mike's blog post)
  2. enlevé AccountController et les vues/dossier compte
  3. créé une classe d'authentification personnalisée basée sur this link

J'ai besoin de tirer d'une table dans la base de données, basée sur l'identifiant AD de l'utilisateur, son "rôle "(int), puis le cast dans les SiteRoles pertinents. L'implémentation de cette requête dans CustomAuthorizeAttribute serait-elle conseillée? existe-t-il un meilleur endroit pour extraire les données de la table et les stocker quelque part afin qu'elles puissent être réutilisées plutôt que d'avoir à exécuter une requête à chaque fois que AuthorizeCore est appelée (ce qui se produit chaque fois qu'un utilisateur appelle un contrôleur/action)?

Répondre

4

Une coutume AuthorizeAttribute est définitivement la voie à suivre car elle sera appliquée avant tous les autres filtres d'action.

Bonté,

Dan

-1

Vous pourriez faire tout ce que vous voulez à l'aide du MVC fourni FormAuthentication. Créez simplement votre méthode personnalisée ValidateLogOn dans AccountController. Exemple:


public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) 
     { 

      if (!ValidateLogOn(userName, password)) 
      { 
       return View(); 
      } 

      FormsAuth.SignIn(userName, rememberMe); 
      Session["userlogin"] = userName; 

      if (!String.IsNullOrEmpty(returnUrl)) 
      { 
       return Redirect(returnUrl); 
      } 
      else 
      { 
       return RedirectToAction("Index", "Home"); 
      } 
     } 

Si votre ValidateLogOn sera quelque chose comme:


     private bool ValidateLogOn(string userName, string password) 
     { 
      if (String.IsNullOrEmpty(userName)) 
      { 
       ModelState.AddModelError("username", "You must specify a username."); 
      } 
      if (String.IsNullOrEmpty(password)) 
      { 
       ModelState.AddModelError("password", "You must specify a password."); 
      } 
      /* 
      * Do your LDAP Validation stuff (DB queries, etc) here. 
      */ 
     } 
+0

un problème est une exigence que j'ai - que les utilisateurs n'ont pas besoin d'entrer leur nom d'utilisateur ou mot de passe, car ils se sont déjà connectés à AD sur vos ordinateurs. –

3

J'utiliser le hors de la boîte ActiveDirectoryMembershipProvider plutôt qu'un attribut personnalisé (parce que réinventer la roue est généralement mauvaise, et réinventer la roue dans le domaine de la sécurité est mauvais au point de l'incompétence dans la plupart des cas), et AzMan Role Provider pour mapper les groupes AD et les comptes aux rôles d'application. Cet appariement vous offre beaucoup plus de fonctionnalités que le code personnalisé (par exemple, interface GUI normalisée pour les autorisations) et est probablement plus sécurisé.

Questions connexes