2010-11-23 22 views
2

Avec le fournisseur d'appartenance par défaut pour les projets MVC 2, je peux faire référence à User.Identity.UserName en fonction de ce qu'il crée par défaut. Je ne veux pas faire ça - je veux utiliser mes propres tables. J'ai donc implémenté la classe System.Web.Security.MembershipProvider. La seule chose que j'ai implémentée, comme beaucoup de messages sur le web et SO, est ValidateUser(string username, string password)Comment puis-je référencer ma propre table avec la propriété MVC Controller.User?

Je peux facilement voir cela accepte les chaînes de nom d'utilisateur et mot de passe, j'accède à mon contexte de base de données (LINQ aux entités, en fait le fournisseur dotConnect pour MySQL), et vérifiez le nom d'utilisateur et mot de passe - assez simple. Mais, comment puis-je rendre l'objet Controller.User utiliser les propriétés de ma propre table. Par exemple, ma table s'appelle Staff. Il a StaffID (PK), Prénom, Nom, etc. Comment puis-je accéder au StaffID de l'utilisateur contextuel actuel comme suit?

int id = User.StaffID; 

Je trouve ce poste par Matt Wrock, mais je ne peux pas vraiment de sens de mettre en œuvre la classe utilisateur, plus précisément la méthode IsInRole. Quand cet objet est-il construit et d'où viennent les arguments du constructeur?

Répondre

2

Je n'aime pas le fournisseur d'adhésion alors j'essaie d'éviter de le traiter à tout prix. Si vous n'utilisez pas le User du contrôleur, vous pouvez effectuer les opérations suivantes.

Créez un contrôleur de base et faites en hériter tous vos contrôleurs.

Dans votre contrôleur de base, ajoutez une propriété appelée CurrentUser du type que vous voulez utiliser (probablement le type Linq 2 Sql). Remplacez la méthode Initialize sur votre contrôleur de base et exécutez la logique pour obtenir l'utilisateur approprié si l'utilisateur est authentifié. Définissez CurrentUser sur le bon utilisateur. Maintenant vous avez accès à cette propriété dans n'importe quel contrôleur qui hérite de votre contrôleur de base.

public BaseController : Controller 
{ 
    public MyUserEntity CurrentUser {get; set;} 

    protected override void Initialize(RequestContext requestContext) 
    { 
      CurrentUser = null; 
      if (requestContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       var userRepository = new UserRepository(); 
       CurrentUser = userRepository.GetUser(requestContext.HttpContext.User.Identity.Name); 
      } 

    } 

} 

Et pour l'utiliser:

public StaffController : BaseController 
{ 
     public ActionResult View() 
     { 
      var staffRepository = new StaffRepository(); 
      var staff = staffRepository(CurrentUser.StaffID); 
      return View(staff); 
     } 
} 
+0

J'aime l'idée de ne pas utiliser le MembershipProvider, mais je suis confus par "de tout type que vous voulez utiliser (probablement Linq 2 Sql type)." Existe-t-il des types d'utilisateurs de fournisseur de données? Ou est-ce une classe personnalisée? Heureusement, j'ai déjà un contrôleur de base en place pour gérer certaines exceptions personnalisées. –

+0

C'est une classe personnalisée. Dans mon application, j'ai une table 'Users' et j'utilise Linq2SQL pour générer des classes. J'utilise la classe 'User' que Linq2SQL génère pour la propriété' CurrentUser'. – Omar

+0

Je pense que je suis. Mes utilisateurs sont dans la table Staff. Donc la propriété CurrentUser que vous avez utilisée ci-dessus devrait être de type Staff, n'est-ce pas? –

1

Vous devrez faire un peu si vous voulez que cela fonctionne.

vous devez définir votre propre classe qui descendent de

GenericIdentity 

Ensuite, vous aurez besoin de définir votre propre classe qui descend de

GenericPrincipal 

Cette classe peut avoir les propriétés que vous » J'aimerais faire référence (StaffID par exemple). Vous devrez alors vous connecter au processus d'authentification actuel et affecter l'instance de votre descendant GenericPrincipal à la propriété "User".

Ensuite, chaque fois que vous faites référence si vous devez le transformer pour être votre type afin d'accéder aux propriétés supplémentaires.

((MyPrincipal)User).StaffID 

C'est un peu plus de travail par rapport à ce que vous avez dû faire jusqu'à présent.

Mais c'est faisable.

+0

Comment voulez-vous "crochet dans le processus d'authentification réelle"? Voulez-vous dire dans la méthode ValidateUser dans MembershipProvider? –

+0

Vous implémenter l'événement OnAuthenticate dans un HttpModule et y faire vos tâches. FYI - coller avec le mécanisme d'authentification fourni par ASP.NET est mieux (à long terme) que de faire quelque chose de complètement différent. C'est définir votre propre descendant GenericPrincipal et descendre cette route est mieux que de l'éviter complètement. Le fournisseur d'appartenance est juste une implémentation du mécanisme intégré ASP.NET. Si cela ne fonctionne pas pour vous, mettez en place le vôtre. Ça va payer beaucoup de temps à long terme. ASP.NET/WCF applications la même infrastructure –