2010-02-15 7 views
2

Je construis une application en utilisant asp.net mvc, DI, IoC, TDD comme un peu d'un exercice d'apprentissage.ASP.NET scinder l'appartenance et utiliser le modèle de référentiel

Pour l'accès à mes données, j'utilise le modèle de référentiel. Maintenant, je regarde l'adhésion et comment cela peut fonctionner avec le modèle de dépôt. J'utilise actuellement un référentiel Linq to Sql mais je ne veux pas être lié à SQL Server pour l'appartenance.

Deuxièmement, je suis à la recherche de diviser à l'adhésion en un certain nombre de services:

  • AuthenticationService - identifier l'utilisateur
  • AuthorizationService - que peuvent-ils faire
  • PersonalizationService - Profil

Le service de personnalisation sera ce qui définit vraiment un «client» dans mon application et chaque client aura un identifiant/nom d'utilisateur unique qui lie à l'Au thenticationService - ce qui me permet d'utiliser le fournisseur d'appartenance ASP.NET par défaut, de lancer le mien ou d'utiliser quelque chose comme Open ID.

Est-ce une bonne approche? Je ne veux pas réinventer la roue mais préférerais que ces parties importantes de mon application suivent les mêmes schémas que les autres.

Merci Ben

Répondre

1

Jetez un oeil à la RIA Authentication, Roles, and Profiles service s .. pas besoin de réinventer la roue.

+0

Merci pour la réponse. Pardonnez mon ignorance mais je ne vois pas comment RIA va aider. Si j'utilise plusieurs clients, par exemple mvc et silverlight je peux voir comment cela serait utile. Cependant, comme il est construit en plus de l'appartenance standard à ASP.NET, il semble que cela change la façon dont le service d'authentification est exposé à mon application, mais pas comment cela fonctionne réellement, ou comment il interagit avec mon modèle. Merci de votre aide. –

0

Pour être honnête, réaliser ce que je voulais était un processus assez simple. Je n'ai pas encore implémenté le AuthorizationService mais cela suivra un modèle similaire.

Mon service d'authentification est assez simple:

public interface IAuthenticationService 
{ 
    bool IsValidLogin(string username, string password); 
} 

Il y aura une méthode CreateUser mais je n'ai pas encore mis en œuvre ce.

Création d'un service d'authentification en utilisant le fournisseur d'appartenances standard est un travail simple:

public class AspNetAuthenticationService : IAuthenticationService 
{ 
    public bool IsValidLogin(string username, string password) 
    { 
     return Membership.ValidateUser(username, password); 
    } 
} 

Si je veux échanger le SqlMembershipProvider par défaut avec mon propre alors j'ai juste besoin de changer web.config. Afin de prendre en charge différents types d'authentification (peut-être des formulaires auth et openID), je peux simplement créer une action de contrôleur pour chacun et appeler l'implémentation IAuthenticationService.ValidateUser appropriée avant de définir un cookie d'authentification.

Le processus d'authentification pour identifier l'utilisateur. Afin d'obtenir le "client" j'utilise un PersonalizationService. L'interface de ce nouveau est assez simple:

public interface IPersonalizationService { 
    Customer GetCustomer(string username); 
} 

Ce retourne mon client (avec des adresses, des commandes passées - les choses que nous soucions vraiment). La méthode GetCustomer va créer un objet client s'il n'existe pas avec le nom d'utilisateur passé. Donc, si vous utilisez des formulaires standard auth, un client sera créé de toute façon lors de l'inscription. Si vous utilisez quelque chose comme OpenID, la première fois qu'ils se connectent à un objet client sera créé et lié à leur nom d'utilisateur OpenID (d'où la raison de séparer ce qu'est un "utilisateur" authentifié d'un "client".

Ce processus fonctionne également bien pour le paiement anonyme car je peux créer un objet client en mémoire pour les clients "invités", et finalement le conserver dans la base de données s'ils font un achat. Dans ce cas, je n'ai pas d'utilisateur (car ils ne se sont pas authentifiés) mais j'ai un client.

Je suis assez content de cette implémentation. Je pense que je vais lancer mon propre fournisseur d'appartenance (puisque ce n'est pas vraiment difficile) et je voudrais utiliser le modèle de référentiel pour l'accès aux données. Intéressé d'entendre des opinions/suggestions sur cette approche.

Certaines ressources utilisées: Je

http://noahblu.wordpress.com/2009/02/19/custom-membershipprovider-using-repository-dependency-injection-pattern-magic/

http://davidhayden.com/blog/dave/archive/2007/10/11/CreateCustomMembershipProviderASPNETWebsiteSecurity.aspx

http://pbdj.sys-con.com/node/837990/mobile

http://mattwrock.com/post/2009/10/14/Implementing-custom-Membership-Provider-and-Role-Provider-for-Authinticating-ASPNET-MVC-Applications.aspx

+0

Cela semble être la même approche utilisée par Ron Conery lorsqu'il a refaçonné l'adhésion ASP.NET standard pour adopter OpenId (voir http://www.asp.net/mvc/videos/aspnet-mvc-storefront-part-16- membership-redo-with-openid) que j'ai beaucoup aimé. Une chose avec laquelle j'ai lutté (et que je suis toujours) est .... une fois que vous avez authentifié un utilisateur via OpenId, créez-vous une entrée dans la table d'adhésion ASP.NET pour eux? Ou voulez-vous maintenir une table distincte spécifiquement? Intéressé par ce que vous avez fini par faire. – James

+1

@James - travaillant sur la base des utilisateurs (authentification) et des profils (personnalisation), nous aurions une table distincte pour notre système d'authentification interne et un tableau distinct pour nos profils. Les profils contiennent une référence au nom d'utilisateur d'authentification. Cela peut être un nom d'utilisateur dans la table des utilisateurs internes ou une URL de demande openid. L'idée est que, indépendamment de la façon dont l'utilisateur s'authentifie, nous pouvons charger son profil. J'espère que cela a du sens. –