2010-10-11 7 views
6

Ich arbeite an der Implementierung eines benutzerdefinierten Mitgliedschaft-Provider, der gegen ein vorhandenes Schema in meiner Datenbank funktioniert und ein paar Gedanken/Fragen.Login-Steuerelement und benutzerdefinierte Mitgliedschaft Provider

Die Anmeldesteuerung wird automatisch die ValidateUser-Methode des Mitgliedschaftsanbieters aufrufen. Unabhängig von der Implementierung des Anbieters ist das einzige, was die Anmeldesteuerung interessiert, der Bool-Wert, der von dieser Methode zurückgegeben wird. Was mich verwirrt, ist, dass es mehrere Gründe dafür geben könnte, warum ein Login-Versuch fehlgeschlagen ist; Der Benutzer ist ausgesperrt, zu viele Versuche in einem bestimmten Zeitraum usw. Es gibt keine Möglichkeit, dies der Steuerung zu vermitteln, damit die richtige Nachricht angezeigt werden kann. Andere Eigenschaften des Mitgliedschaftsanbieters wie PasswordStrengthRegularExpression haben absolut keine Auswirkung auf das Login-Steuerelement (out of the box). Ich hätte gehofft, dass es irgendwie in Validatoren für reguläre Ausdrücke übersetzt würde, aber das scheint nicht das zu sein Fall. Es scheint also, dass ich die Login-Steuereigenschaften mit diesen Einstellungen aus der Provider-Konfiguration initialisieren muss, wenn ich möchte, dass sie das Steuerelement selbst übernehmen.

Wenn die einzige Sache, dass das Login-Steuerelement tut aus der Box (ohne manuell Ereignisse und dabei die Initialisierung, wie oben beschrieben Handling) ist rufen Sie die ValidateUser Methode auf dem Mitgliedschaftsanbieter, sehe ich keine Möglichkeit zum Anmelden vermitteln zurück Kontrollieren Sie, warum die Validierung fehlgeschlagen ist oder ob Sie beispielsweise Validierungsanforderungen auf der Basis eines bestimmten Zeitfensters einschränken. Letztendlich ist meine Frage, warum sollte ich den Mitgliedschaftsanbieter dann auch in Verbindung mit der Login-Kontrolle benutzen? Es scheint, dass es nur für eine Antwort vom Typ Ja/Nein entworfen wurde, was sehr restriktiv ist. Wenn ich Logik mit verschiedenen Nachrichten zurück zu dem Benutzer erstellen möchte, muss ich die Login-Steuerereignisse behandeln und meine eigenen Authentifizierungsklassen aufrufen, die alle meine Geschäftsanforderungen verarbeiten, und eine benutzerdefinierte Fehlermeldung zurück an das Login-Steuerelement an zurückgeben Anzeige für den Benutzer, damit sie wissen, warum ihr Versuch ungültig ist.

Wenn ich nicht falsch in meinen Annahmen bin, scheint es, dass die Schnittstelle zwischen dem Login-Steuerelement als Mitgliedschaft API zu restriktiv ist, um nützlich zu sein. Vielleicht funktioniert die API besser für andere Auth Controls wie ChangePassword besser, aber für die eigentliche Login-Kontrolle sehe ich den Punkt nicht.

Ich schätze Ihre Gedanken.

Antwort

4

Sie richtig sind. Um die Logik zu implementieren, über die Sie sprechen, müssen Sie das Authenticate-Ereignis implementieren. Auf diese Weise können Sie eine benutzerdefinierte Fehlermeldung zurückschreiben, nachdem Sie Ihre eigene Validierung durchgeführt haben.

Auf der anderen Seite glaube ich nicht, dass die Passwortstärke bei der Authentifizierung validiert werden sollte, sondern eher bei der Benutzererstellung.

protected void Login_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    try 
    { 
     e.Authenticated = myMembershipProvider.ValidateUser(LoginControl1.UserName,LoginControl.Password); 

    } 
    catch(Exception ex) 
    { 
     LoginControl1.FailrureText = ex.Message; 
    } 
} 

und werfen Sie Ihre benutzerdefinierte Ausnahme in Ihrem ValidateUser Methode:

Sie so etwas schreiben könnte. Happy coding ...

+0

Hat nicht der Mitgliedschaftsanbieter verliert es Wert ist an diesem Punkt zu mir? Wenn ich vorausfahre und das Authenticate-Ereignis behandle, muss ich die ValidateUser-Methode beim Provider selbst aufrufen. Diese Methode wird nicht ausreichen, also müsste ich eine andere Methode aufrufen, die mir sagt, warum die Anmeldung fehlgeschlagen ist. Ich stimme dir bei der Passwortstärke zu. – e36M3

+0

@ e36M3 - Yeap Sie haben Recht. Das ist der Weg zu gehen. Was ich tun würde ist, zuerst alle Validierung aufrufen, schreiben Sie den Fehler auf der Steuerung ErrorMessage-Eigenschaft und schließlich, wenn etwas fehlschlägt, –

2

Ich hatte die gleiche Art von Problem bei der Verwendung von Login-Methode (Passwort ändern) mit dem Mitgliedschaftsanbieter, wo ich wollte mehr Informationen als nur ein Ja/Nein. Hoffentlich können Sie eine Lösung implementieren, die der von mir entwickelten Problemumgehung ähnelt. Siehe dazu:

Membership provider ChangePassword method return type problem

+0

Danke, gut zu wissen, dass ich nicht verrückt werde. Ist es nicht gefallen, dass wir hier etwas verpasst haben? Das lässt mich am Anfang den Mitgliedschaftsanbietern den Vortritt lassen.Ich brauche es nicht, wenn ich es werde haben, als auch zu hacken als hacken Sie die Kontrollen mit ihm zu arbeiten, um wie hilfreichen Fehlermeldungen aus dem es einfache Dinge zu bekommen. Der einzige Vorteil für den Anbieter für mich war die Out-of-the-Box-Integration mit der Steuerung, die extrem limitiert scheint. – e36M3

1

Okey, wenn Sie die Login-Kontrolle Sache nicht ändern können, werden Sie schließlich eine andere Login-Control-Schnittstelle benötigen!

Verwandte Themen