Question

J'ai dû créer un fournisseur d'appartenances personnalisé pour mon projet en cours ASP .Net afin d'intégrer dans notre schéma de base de données, et ai des problèmes de la configuration pour verrouiller un utilisateur s'ils obtiennent leur mot de passe erroné trois fois, comme est pris en charge par les fournisseurs standard.

Est-ce quelque chose que je dois me mettre en œuvre, ou devrait-il être intrinsèquement pris en charge?

Je n'ai pas du code qui traite spécifiquement (et aucun des membres l'interface semblent traiter spécifiquement), mais si je dois mettre en œuvre moi-même, comment puis-je faire pour informer l'utilisateur qu'ils sont verrouillés? Ai-je besoin de lever une sorte d'exception dans ValidateUser?

Solution

Dommage que je ne peux pas marquer deux réponses, les liens fournis par Dave R donnent un regard en profondeur sur la façon dont fonctionne l'adhésion, et ce que Zhaph a fait remarquer était juste ce que je fini par faire, la manipulation de la logique en lock-out dans la mesure fournisseur d'appartenances.

Je traite ensuite la condition d'erreur en utilisant l'événement de contrôle de connexion loginError et vérifié là-bas pour voir si l'utilisateur a été verrouillé pour afficher le message d'erreur approprié.

Était-ce utile?

La solution

Scott Mitchell a écrit une excellente série de tutoriels sur le site ASP.NET. Ce lien contient des informations sur la création d'un fournisseur personnalisé et examine la logique de verrouillage:

http://www.asp.net/LEARN/security/ tutoriel-06-cs.aspx

Il y a aussi pas de méthode en construction pour déverrouiller les comptes (à savoir que vous avez à faire grâce à des outils de base de données si vous utilisez quelque chose de similaire à la SqlMembershipProvider). Scott a également écrit un article sur la création d'une interface utilisateur pour gérer ce que vous pouvez trouver ici:

http://www.asp.net/LEARN/security/ tutorial-14-vb.aspx

Je recommande en fait la lecture de la série. un excellent communicateur de Scott.

J'espère que cette aide.

Autres conseils

Ceci est quelque chose que vous auriez à vous écrire.

Le schéma de base de données par défaut a les colonnes suivantes dans le tableau aspnet_Membership:

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

Le nombre de tentative sera incrémenté à chaque tentative a échoué dans la fenêtre de tentative, et le temps de la première tentative a échoué est stocké dans la fenêtre colonne de début, une fois FailedPasswordAttemptCount est égale à la MaxInvalidPasswordAttempts de la configuration, le IsLockedOut est réglé.

Comme l'indique Michiel, votre méthode de ValidateUser alors besoin de vérifier ces valeurs en fonction des paramètres de la configuration du fournisseur - par défaut ce sont:

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

Une fois que l'utilisateur a eu les tentatives de connexion maximum, vous devrez vous assurer que vous avez défini le MembershipUser.IsLockedOut est défini par votre fournisseur - vous pouvez alors vérifier que la valeur et se comporter de façon appropriée - si vous utilisez la connexion par défaut contrôles, cette valeur sera probablement déjà cochées pour vous.

Répliquer les conditions qui conduisent à un lock-out (trop de tentatives de connexion). Parce que les fournisseurs d'adhésion font un voyage à leur back-end chaque fois, il est judicieux de limiter cette approche aux fournisseurs avec un nombre raisonnable de MaxInvalidPasswordAttempts.

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }

Dans votre fournisseur d'appartenances personnalisé, vous devez implémenter la fonction ValidateUser. Il vous vérifier non seulement si le nom d'utilisateur et mot de passe sont valides, mais vous récupérez également le nombre de tentatives de mot de passe non valides etc de votre datastore. Si le nom d'utilisateur / mot de passe est valide, réinitialiser le compteur de mot de passe de tentative, otherelse augmenter le nombre de tentatives. Le SqlMembershipProvider stocke également le datetime LastAttempt, donc vous ne pouvez pas vous bruteforcer façon parce que vous n'êtes pas autorisé à tenter dans un certain laps de temps.

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