Question

Une fois que toutes les réponses à ma dernière question à propos de réglage fin avéré être plus utile que prévu, je pensais que je poser une autre question similaire sur les MembershipProviders ainsi.

D'accord, donc tout d'abord, de préciser: Je sais ce qu'est une composition, le rôle et fournisseur de profils est, comment mettre en œuvre ma propre, et comment les configurer, et la plupart des choses sur les
. La mise en œuvre d'un rôle et fournisseur de profil est assez simple, car ils ne nécessitent que CRUD simples la plupart du temps. (Une seule ligne de LINQ est suffisant pour environ la moitié des méthodes de l'RoleProvider.)

Toutefois, le fournisseur d'appartenances est une bête Différend. Beaucoup d'entre vous se rendre compte qu'il viole le principe SR (responsabilité unique), car il doit faire tout ce qui concerne la gestion des utilisateurs. Bien que cela laisse beaucoup de place pour les personnalisations, il a ses inconvénients aussi. Il n'y a pas d'informations sur Internet à propos de ce que leur comportement EXACT attendu est, par exemple quand ils doivent lever des exceptions ou retourner simplement nulle, et d'autres choses comme ça.

J'utilise cette mise en œuvre échantillon pour référence, mais aussi contient plusieurs contradictions.

  • Par exemple, il utilise sa propre méthode ValidateUser pour vérifier les informations d'identification dans la méthode ChangePassword. Mais le ValidateUser met également à jour dateConnexionPrecedente de l'utilisateur à la date actuelle. Ainsi, le cadre ne vous attendez que je l'ai mis dans mon propre fournisseur aussi bien, ou est-ce simplement une erreur dans l'échantillon?
  • L'autre est le suivant: la méthode ChangePassword lance une exception à chaque fois lors de la validation du nouveau mot de passe, mais CreateUser ne jamais lancer une exception, il retourne simplement false
  • .
  • Et enfin, mais non le moindre: il compte les tentatives de mot de passe non valide de l'utilisateur et les verrous si elle dépasse un seuil. Bien que ce soit bon, mais il nécessite une action manuelle pour déverrouiller les utilisateurs. Est-ce un problème si mon fournisseur débloque automatiquement l'utilisateur après un certain laps de temps?

  • (EDIT) I presque oublié: la méthode de CreateUser dans l'échantillon insère l'identifiant du paramètre de procédé. Je pense que cela est une mauvaise pratique, parce que j'utilise inters avec incement automatique comme ID, afin de les insérer à partir de certains paramètres de méthode n'est pas une option. Dois-je simplement ignorer le paramètre, ou présupposent que sa valeur est nulle et jette une exception si ce n'est pas?

Dans l'ensemble, ne ASP.NET ont des hypothèses sur le comportement d'un MembershipProvider
Y at-il des documents décrivant quand dois-je jeter un nul d'exception ou juste retour?

J'ai aussi essayé de trouver un ensemble de tests unitaires génériques qui fournirait des indications sur le comportement attendu, mais pas de chance, je l'ai trouvé beaucoup d'articles sur « tests unitaires est bon » et « Comment test unitaire d'une MembershipProvider » , mais pas celui où il y aurait des tests réels.

Merci à l'avance pour tout le monde!

Était-ce utile?

La solution

Vous pouvez consulter MSDN pour obtenir des conseils. Par exemple, RoleProvider.RemoveUsersFromRoles fournit les indications suivantes:

  

RemoveUsersFromRoles est appelé par   RemoveUserFromRole,   RemoveUsersFromRole,   RemoveUserFromRoles et   méthodes de la RemoveUsersFromRoles   classe rôles pour supprimer spécifié   les utilisateurs des rôles spécifiés au   la source de données. rôles uniquement pour la   configuré NomApplication sont   modifié.

     

Si l'un des noms de rôle sont spécifiés   pas trouvé pour configurer   applicationName, nous vous recommandons   votre fournisseur jeter un   ProviderException.

     

Si l'un des noms d'utilisateur spécifiés sont   pas associée à l'un des   Les noms de rôle spécifié pour la   Configuré applicationName, nous   recommande que votre fournisseur jeter un   ProviderException.

     

Si l'un des noms d'utilisateur spécifiés est   null ou est une chaîne vide, nous   recommande que votre fournisseur jeter un   exception.

     

Si l'un des noms de rôle spécifié est   null ou est une chaîne vide, nous   recommande que votre fournisseur jeter un   exception.

     

Si votre support de source de données   transactions, nous vous recommandons   inclure chaque opération de suppression dans un   transaction et que vous roulera la   transaction et jeter une exception si   tout échec de l'opération de suppression.

RoleProvider.GetRolesForUser dit:

  

GetRolesForUser est appelée par la méthode de GetRolesForUser de la classe des rôles pour récupérer les noms de rôle que l'utilisateur spécifié est associé à partir de la source de données. Seuls les rôles nomApplication configurés sont récupérés.

     

Si aucun rôle existe pour l'utilisateur spécifié pour nomApplication configuré, nous recommandons que votre fournisseur retourne un tableau de chaînes sans éléments.

     

Si le nom d'utilisateur spécifié est nul ou est une chaîne vide, nous recommandons que votre fournisseur lancer une exception.

Mais, dans la pratique, il y a seulement quelques méthodes et les comportements de chaque fournisseur qui sont nécessaires et attendues. Les autres sont en charge les fonctions que vous souhaitez mettre en œuvre.

Après plusieurs années de faire face à la pile de fournisseur par défaut, je suis venu à comprendre certaines des choses qui vous donnent une pause sur l'exemple que vous un lien, qui est une mise en œuvre très simple que les coins de coupes, par exemple, dans le ChangePassword méthode.

Si vous utilisez le réflecteur et SqlMembershipProvider vous examiniez remarquer quelques différences saillants ...

Par exemple:

  • date de connexion de ValidateUser parce que, eh bien, l'utilisateur se connecte et il le fait en appelant .CheckPassword avec vrai pour UpdateLastLoginTime. Modifier le mot de passe appelle la même méthode, mais les fournitures faux.

  • La méthode CreateUser accepte un ProviderUserKey parce que la procédure stockée sera également accepter un paramètre UserId. Ceci pour permettre les loisirs et les membres syncronization entre et tables utilisateurs. En tant que consommateur de l'API que vous ne pas utiliser normalement cette fonctionnalité, mais la pile de fournisseur fait en interne.

  • En ce qui concerne le verrouillage .. Il est à vous. C'est ce que la mise en œuvre des fournisseurs personnalisés est tout au sujet: obtenir le comportement que vous voulez. Comme je l'ai dit, il y a très peu d'exigences systématiques.

Alors, cela nous amène à la dernière partie de votre question (les deux paragraphes font allusion à la même préoccupation): comportement attendu et les tests unitaires ...

Le comportement d'un fournisseur est en grande partie arbitraire et il y a peu de comportements attendus, un ensemble établi de tests génériques contiendrait des méthodes très peu. Vous devez les tests d'écriture applicables au comportementde votre mise en œuvre.

Comme note finale, je vous suggère et trouvez < a href = "http://download.microsoft.com/download/a/b/3/ab3c284b-dc9a-473d-b7e3-33bacfcc8e98/ProviderToolkitSamples.msi" rel = "nofollow noreferrer"> télécharger Asp des échantillons de boîte à outils de fournisseur .Net. Il vous fournit le code source de travail pour la pile de fournisseur Sql complet et vous donnera un aperçu de la façon dont les fournisseurs « réels » sont mis en œuvre.

Afterthoughts :

A ce moment, je suis en œuvre une pile de fournisseur SQLite complet qui est 100% compatible avec la valeur par défaut pile Sql. La suite de test vérifie la parité de comportement entre ma pile et de asp.net. Si vous appuyez sur mon blog via mon profil et me contacter, je vais vous laisser savoir quand les tests sont terminés et vous pouvez les utiliser comme une référence à ce qui est exactement attendu de la pile par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top