2012-03-12 4 views
6

J'utilise FormsAuthentication, mais j'ai ajouté un membre MemberShipProvider personnalisé pour valider par rapport à une table utilisateur personnalisée.Meilleure pratique pour conserver un ID utilisateur (MVC)

Toutes les tables contenant des "données utilisateur" ont une colonne idUser, donc j'ai besoin de maintenir l'id utilisateur afin de présenter l'utilisateur avec ses données.

Auparavant, j'ai utilisé une variable de session (ASP.NET Webform), mais comme je suis en train de réécrire l'application web sur MVC, je voudrais demander ce qui est généralement considéré comme la meilleure approche pour cela.

La variable de session est-elle toujours le meilleur endroit pour contenir l'idUser, ou devrais-je ajouter un "Current.User.Identity" personnalisé qui, en plus du nom d'utilisateur, contient également un userId public? Ou devrais-je choisir une approche complètement différente?

Répondre

3

J'ai eu la même question lorsque j'ai implémenté un fournisseur d'appartenances personnalisé pour MVC. J'ai fini par faire deux choses. Je stocke l'ID de l'utilisateur dans le champ ProviderUserKey de l'objet MembershipUser. Voir provideruserkey. Ensuite, pour répondre à votre question, oui, j'ai créé un principal personnalisé à partir de System.Web.Security.IPrincipal, mais j'ai hérité plus tard de System.Web.Security.RolePrincipal à la place, car je voulais un support pour les rôles.

public class MyPrincipal : RolePrincipal 
{ 
    public Guid Id { get; set; } 

    public MyPrincipal(string providerName, IIdentity identity, Guid id) : base(identity) 
    { 
     Id = id; 
    } 
} 

Mise à jour: La raison pour laquelle je ne voulais pas utiliser la session dans mon cas parce que je l'ai désactivé pour l'application. J'ai lu que le concept de base derrière MVC est la séparation des préoccupations, et que cela ressemble étroitement à la façon dont fonctionne le Web, qui est apatride. Bien que je ne me souvienne pas d'où je lis cela maintenant que j'essaie de m'en souvenir. Cependant, je me souviens aussi avoir lu que si vous pouvez éliminer la session, vous devriez le faire. Il permettra à IIS de répondre aux demandes simultanées de votre application plutôt que d'attendre qu'une demande se termine (et libère la session de l'utilisateur) avant que la prochaine demande puisse utiliser la session et envoyer sa réponse. Le plus gros impact est le chargement du contenu de la page en utilisant Ajax.

+0

Merci! Je pensais à une approche similaire. Bien que je sois d'accord avec @ Mark S. ci-dessus, que la chose la plus simple est d'utiliser l'objet de session. – Kman

+0

Ajout de détails pour les raisons pour lesquelles j'ai évité la session –

+0

La session n'est pas nécessairement mauvaise et peut être une nécessité. Souvent, je vois les utilisateurs désactiver la session et commencer à trop s'appuyer sur les cookies en augmentant la taille de chaque requête HTTP. Une autre façon de traiter des requêtes simultanées est d'utiliser des contrôleurs asynchrones, ce qui est assez facile dans la bêta MVC4 et peut être fait avec un peu de travail dans les versions précédentes. – Mark

3

Vos noms d'utilisateur sont-ils uniques? Si c'est le cas, il n'est pas nécessaire de gérer l'UserId car vous pouvez simplement récupérer un utilisateur par nom d'utilisateur.

Mes projets MVC ont mis en œuvre l'adhésion de la même manière qu'une application Web Forms traditionnelle. Je ne pense pas qu'il y ait une raison de regarder les deux différemment, sauf si vous essayez de construire une application de type REST sans état. Comment avez-vous géré votre UserId dans les formulaires Web? Session? Ensuite, utilisez la session dans MVC. Il n'y a aucune raison de réinventer la roue.

Bien sûr, si vous avez d'autres raisons de changer, il y a beaucoup de façons de stocker l'ID utilisateur. Vous pouvez le stocker dans les UserData du cookie d'authentification. Vous pouvez également créer votre propre ticket d'authentification qui utilise l'ID utilisateur comme clé plutôt que le nom d'utilisateur. Vous pouvez même créer un Principal personnalisé pour stocker des informations supplémentaires.

Vous pouvez donner votre avis Forms Authentication Configuration and Advanced Topics. Cet article couvre le stockage des données supplémentaires (UserId) dans le ticket d'authentification et la création d'un principal personnalisé. Les deux méthodes correspondraient probablement à vos besoins.

+0

Les noms d'utilisateur sont uniques, mais j'ai besoin de la cause userId qui est la colonne d'identité dans mon modèle (base de données). Donc obtenir des données à partir d'une table que j'ai besoin de l'interroger avec ... où userid = idUser. Je vais regarder dans le lien que vous avez fourni :) – Kman

+0

Session est le moyen le plus simple et le plus rapide pour maintenir votre UserId. L'utilisation de MVC n'exclut certainement pas l'utilisation de session. Mes 2 cents, utilisez la session. – Mark

+0

Je suis d'accord. Ça se passe bien dans mon application webform. Ma principale préoccupation était que dans MVC cette approche était "périmée". Merci encore!:) – Kman

Questions connexes