In ASP.NET 2.0 können die neu hinzugefügte Mitgliedschaftsanbieterfunktion in Kombination mit einer Reihe leistungsstarker Registrierungs- und Anmeldesteuerelemente Benutzeranmeldungen und -berechtigungen einfach verwalten (siehe << Einführung in ASP.NET 2.0-Anmeldesteuerelemente >>).
Möglicherweise stellen Sie jedoch fest, dass die in ASP.NET 2.0 enthaltenen Anmeldesteuerelemente und Mitgliedschaftsverwaltungsfunktionen standardmäßig mit SQL Server 2005 Express verwendet werden. Wie kann man sie also ändern, um SQL Server 2000 oder andere Datenquellen wie den Zugriff zu verwenden? , Orakel usw.? Wenn Sie eine Anwendung neu schreiben möchten, um angemeldete Benutzer oder Benutzerberechtigungen in Ihrer Anwendung zu verwalten, wie sollten Sie sie ändern? In diesem Artikel zeigen wir, wie Sie einen benutzerdefinierten Anbieter in ASP.NET 2.0 verwenden, um mit der Anmeldesteuerung zusammenzuarbeiten und einen einfachen Anmeldevorgang zu implementieren.
Um zu verstehen, wie der Anbieter in ASP.NET 2.0 funktioniert, schauen Sie sich zunächst das folgende Strukturdiagramm an:
Feldname Datentyp Feldgröße Benutzername (Schlüssel) Text 8 Passworttext 8 E-Mail-Text 50 PasswortFragetext 50 PasswortAntworttext 50 |
Öffentliche Klasse ModifiedSqlMembershipProvider Erbt SqlMembershipProvider Öffentliche Überschreibungsfunktion CreateUser (...) ... Funktion beenden ... Endklasse |
Wenn Sie den in Visual Studio 2005 Beta 2 bereitgestellten SqlMembershipProvider nicht verwenden möchten, müssen Sie nur Ihre eigene Klasse deklarieren und die MembershipProvider-Klasse erben. Die MembershipProvider-Klasse enthält auf die Mitgliedschaft bezogene Methoden und Eigenschaften.
Verwenden Sie im Projektmappen-Explorer „Neues Element hinzufügen …“, um eine Klasse hinzuzufügen, benennen Sie sie „AccessMembershipProvider.vb“ und befolgen Sie die Systemanweisungen, um sie im Verzeichnis „App_Code“ zu platzieren.
Verweisen Sie als Nächstes auf den relevanten Namespace und schreiben Sie das Framework des Programms wie folgt:
Importiert Microsoft.VisualBasic
Importiert die
öffentliche System.Data-Klasse AccessMembershipProvider
Erbt MembershipProvider
Um einen benutzerdefinierten Anbieter verwenden zu können,
mussEnd Class
entsprechende Konfigurationen in web.config vornehmen.Sie können eine neue web.config-Datei hinzufügen und den folgenden Code schreiben:
<system.web>
<authentication mode="Forms"/>
<Mitgliedschaft
defaultProvider="AccessMembershipProvider" >
<Anbieter>
<add name="AccessMembershipProvider"
type="AccessMembershipProvider"
erfordertQuestionAndAnswer="true"
ConnectionString="Provider=Microsoft.Jet.
OLEDB.4.0;Datenquelle=C:NewMembershipProvider
App_DataMembers.mdb;Persistierende Sicherheit
Info=False" />
</providers>
</Mitgliedschaft>
</system.web>
Beachten Sie dabei bitte die folgenden Punkte:
Als Authentifizierungsmethode muss „Forms“ (authentication mode="forms") ausgewählt werden.
Fügen Sie mithilfe des <add>-Tags einen benutzerdefinierten Anbieter mit dem Namen AccessMembershipProvider hinzu .
Wenn das Attribut „requiresQuestionAndAnswer“ den Wert „true“ hat, gibt es an, dass bei der Neuregistrierung Eingabeaufforderungen und Antworten zur Beantwortung ausgefüllt werden müssen.
ConnectionString gibt die Verbindungszeichenfolge für die Verbindung mit der Datenbank an.
Das DefaultProvider-Attribut gibt an, welchen Anbieter das System standardmäßig verwendet, da in einem System mehrere Anbieter festgelegt werden können.
Fügen Sie in AccessMembershipProvider.vb das folgende private Mitglied
Private connStr As String
hinzu
Private Kommunikation Wie neu OleDb.OleDbCommand
Private _requiresQuestionAndAnswer als boolescher Wert
Private _minRequiredPasswordLength Als Ganzzahl
und die Initialize()-Methode hinzufügen, der Code lautet wie folgt
Public Overrides Sub Initialize(ByVal name As String, ByVal config As System.Collections.Specialized.NameValueCollection)
'===ruft die eingestellten Attributwerte ab
'web.config und lokalen Variablen zuweisen===
Wenn config("requiresQuestionAndAnswer") = "true" dann _
_requiresQuestionAndAnswer = True
connStr = config("connectionString")
MyBase.Initialize(name, config)
End SubWenn
der Anbieter geladen ist, wird die Methode Initialize() aufgerufen. In der aktuellen Datei web.config können mit dieser Methode die verschiedenen Attributwerte gelesen werden, die mit dem Tag <add> festgelegt wurden. Es kann beispielsweise mithilfe des Konfigurationsparameters gelesen werden. Im obigen Code wird config("connectionString") verwendet, um die Datenbankverbindungszeichenfolge zu lesen und in die Variable connStr einzufügen. Legen Sie anschließend die Eigenschaft „RequiresQuestionAndAnswer“ wie folgt fest:
Public Overrides ReadOnly Property _
RequiresQuestionAndAnswer() _
Als Boolescher Wert
Erhalten
Wenn _requiresQuestionAndAnswer = True, dann
Gibt True zurück
Anders
Gibt „False“ zurück
Ende wenn
Beenden Sie Get
End-Eigenschaft
Beachten Sie, dass der Wert dieser Eigenschaft festgelegt werden muss, andernfalls werden im CreateUserWizard-Steuerelement die beiden Textfelder „Frage zur Passwort-Eingabeaufforderung“ und „Antwort zur Passwort-Eingabeaufforderung“ nicht angezeigt.
Als nächstes können wir mit dem Schreiben des Codes zum Erstellen eines neuen Benutzers beginnen. Der Code der CreateUser()-Methode lautet wie folgt:
Public Overrides Function CreateUser(ByVal username As String, ByVal password As String, ByVal email As String, ByVal passwordQuestion As String , ByVal „passwordAnswer“ als String, „ByVal isApproved“ als boolescher Wert, „ByVal „providerUserKey“ als Objekt, „ByRef status“ als „System.Web.Security.MembershipCreateStatus“ als „System.Web.Security.MembershipUser“.
Dim conn As New OleDb.OleDbConnection(connStr)
Versuchen
conn.Open()
Dim sql As String = "INSERT INTO Membership VALUES (" & _
„@Benutzername, @Passwort, @E-Mail,“ & _
„ @passwordQuestion, @passwordAnswer )“
Dim Comm As New OleDb.OleDbCommand(sql, conn)
comm.Parameters.AddWithValue("@Benutzername", Benutzername)
comm.Parameters.AddWithValue("@password", Passwort)
comm.Parameters.AddWithValue("@email", E-Mail)
comm.Parameters.AddWithValue("@passwordQuestion", passwortQuestion)
comm.Parameters.AddWithValue("@passwordAnswer", passwortAnswer)
Ergebnis verdunkeln als Ganzzahl = comm.ExecuteNonQuery()
conn.Close()
Status = MembershipCreateStatus.Success
Benutzer als neuen MembershipUser dimmen („AccessMembershipProvider“, Benutzername, Nichts, E-Mail, Passwort, Frage, Nichts, Wahr, Falsch, Jetzt, Nichts, Nichts, Nichts, Nichts)
Zurückkehrender Benutzer
Ex als Ausnahme einfangen
status = MembershipCreateStatus.UserRejected
Nichts zurückgeben
Beenden Sie den Versuch
Endfunktion
Lassen Sie uns den obigen Code interpretieren. Zuerst fügen wir einen Datensatz in die Datenbank ein. Nachdem der neue Benutzer erfolgreich hinzugefügt wurde, müssen wir eine Statusinformation zurückgeben (der Status wird als ByRef-Status als System.Web.Security .MembershipCreateStatus übergeben). Methode) und wir möchten eine Instanz der MembershipUser-Klasse zurückgeben, also geben wir ihre Instanz auf diese Weise zurück:
Dim user As New MembershipUser("AccessMembershipProvider", username, Nothing, email, passwordQuestion, Nothing, True , False, Now, Nichts, nichts, nichts, nichts)
Unter ihnen gibt es viele Konstruktoren, die die Methoden der MembershipUser-Klasse verwenden. Weitere Informationen finden Sie in MSDN. Hier verwenden wir nur Benutzername, E-Mail, Passwort, Erstellungsdatum (Kontoerstellungsdatum, JETZT). hier verwendet).
Um auf der Anmeldeseite festzustellen, ob sich ein legitimer Benutzer anmeldet, müssen Sie den folgenden Code schreiben:
Public Overrides Function ValidateUser( _
ByVal Benutzername als String, _
ByVal Passwort (As String) As Boolean
Dim conn As New OleDb.OleDbConnection(connStr)
Versuchen
conn.Open()
Dim sql As String = _
„Wählen Sie * aus der Mitgliedschaft WHERE“ & _
„ Benutzername=@Benutzername UND Passwort=@Passwort “
Dim Comm As New OleDb.OleDbCommand(sql, conn)
comm.Parameters.AddWithValue("@Benutzername", _
Benutzername)
comm.Parameters.AddWithValue("@password", _
Passwort)
Lesegerät verdunkeln As OleDb.OleDbDataReader = _
comm.ExecuteReader
Wenn reader.HasRows Dann
Gibt True zurück
Anders
Gibt „False“ zurück
Ende wenn
conn.Close()
ex als Ausnahme abfangen
Console.Write(ex.ToString)
Gibt „False“ zurück
Beenden Sie den Versuch
Die Endfunktion
ist genau so: Es wird ein einfacher benutzerdefinierter Anbieter fertiggestellt, der für die Anmeldung, Registrierung und andere Steuerelemente verwendet werden kann. Wenn Sie das Programm ausführen, wird zunächst die Benutzerregistrierungsseite angezeigt. Wenn sich der Benutzer erfolgreich registriert, wird er zur Anmeldeseite weitergeleitet, wie in der folgenden Abbildung dargestellt: