Zusammenfassung: Die Mitgliedschaftskomponente von asp.net 2.0 bietet Entwicklern eine Reihe sehr einfacher und benutzerfreundlicher Schnittstellen zur Benutzerverwaltung und Benutzerüberprüfung. In diesem Artikel wird das Implementierungsprinzip kurz analysiert, die korrekte Verwendung und Erweiterung vorgestellt.
1. Abstrakte MembershipProvider-Klasse
In vielen Fällen verwenden wir diese Klasse nicht direkt, wenn wir Membership verwenden. Die MembershipProvider-Klasse definiert einige abstrakte Methoden und abstrakte Attribute. Diese Methoden und Attribute bilden die grundlegenden Spezifikationen der Membership-Schnittstelle, und die Funktionen zur Verwendung von Membership innerhalb des .NET-Frameworks werden alle über diesen Typ aufgerufen. Geerbte Klassen stellen Benutzerverwaltungsfunktionen in verschiedenen Umgebungen bereit, indem sie diese Schnittstellen implementieren, und haben keinen Einfluss auf das Membership-Framework selbst. Werfen wir einen Blick auf die Prototypdefinition von MembershipProvider:
öffentliche abstrakte Klasse MembershipProvider : ProviderBase
...{
// Ereignisse
öffentliches Ereignis MembershipValidatePasswordEventHandler ValidatingPassword;
// Methoden
protected MembershipProvider();
public abstract bool ChangePassword(string username, string oldPassword, string newPassword);
public
abstract bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordAnswer);
Passwort, Zeichenfolge E-Mail, Zeichenfolge PasswortAntwort, Bool isApproved, Objekt ProviderUserKey, Out MembershipCreateStatus
Status
)
;
(string pass, intpasswortFormat
, string salt);
protected virtual byte[] EncryptPassword(byte[] passwort)
; , int pageIndex, int pageSize, out int totalRecords);
interner String GenerateSalt();
public abstract MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords);
public
abstract string GetPassword(string username, string Antwort);
öffentliche Zusammenfassung MembershipUser GetUser(ObjektproviderUserKey, bool userIsOnline);
internal MembershipUser GetUser(string username
, bool userIsOnline, bool throwOnError
(string email)
; protected virtualvoid
OnValidatePasswordEventArgs e);
public abstract string ResetPassword(string username, string answer
)
;
public abstract bool ValidateUser(string username, string passwort);
// Eigenschaften
public
abstract string ApplicationName ...{ get
; } public abstract bool EnablePasswordRetrieval
...{ get
;
abstract int MinRequiredNonAlphanumericCharacters ...{ get;
public abstract int MinRequiredPasswordLength ...{ get;
public abstract int PasswordAttemptWindow ...{
get
;public abstract string PasswordStrengthRegularExpression ... { get; }
public abstract bool RequiresQuestionAndAnswer ...{ get }
public abstract bool RequiresUniqueEmail ...{ get;
// Felder
private MembershipValidatePasswordEventHandler _EventHandler;
private const int SALT_SIZE_IN_BYTES = 0x10
;
Der interne Modifikator besteht aus mehreren Methoden, die Hilfsmethoden für Passwörter sind und zum Verschlüsseln, Entschlüsseln und Überprüfen von Passwörtern verwendet werden. Aber es scheint hier einige Probleme mit dem Design zu geben. Es scheint etwas unangemessen, diese Methoden als internen Bereich zu definieren. Diese Methoden sind in der Basisklasse definiert, damit sie wiederverwendet werden können, aber aus der Sicht der Wirkung ist dies der Fall Dies ist nicht der Fall, da interne Mitglieder nur innerhalb dieser Assembly verwendet werden dürfen (unter normalen Umständen sind andere Methoden wie Reflektion nicht enthalten), was bedeutet, dass unser eigener erweiterter MembershipProvider diese Methoden nicht verwenden kann. Und gemessen am aktuellen Anwendungsbereich werden diese Methoden derzeit nur in SqlMembershipProvider verwendet, daher denke ich, dass diese Methodenmodifikatoren in „geschützt“ geändert werden sollten.
2. Statische Mitgliedschaftsklasse
Wie oben erwähnt, verwenden wir unter normalen Umständen die MembershipProvider-Abstraktion nicht direkt, da sie das Problem der Instanziierung der echten Mitgliedschaftsdienstklasse mit sich bringt und im Allgemeinen die Konfiguration und Instanziierung von Objekten umfasst schwierige Fragen und für Anfänger nicht leicht zu meistern. Im .NET Framework wird diese Ebene komplexer Beziehungen durch die statische Klassenmitgliedschaft (Static Class) abgeschirmt. Zusätzlich zum Schutz der Benutzer vor dem Lesen von Konfigurationsdateien, Anfangsobjekten und anderen grundlegenden Aufgaben spielt die Mitgliedschaft (statische Klasse) auch eine wichtige Rolle beim Neuladen aller MembershipProvider. Daher gibt es APIs, um die Verwendung der Mitgliedschaft für Benutzer komfortabler zu gestalten (Statische Klasse) lädt diese Methoden auch als statische Methode neu und stellt umfangreichere überladene Implementierungen basierend auf der Basis-API von MembershipProvider bereit, die Benutzer aufrufen können. Dies unterstützt direkt, egal ob in der UI-Ebene oder in anderen Projekten. Verweisen Sie einfach auf den System.Web.Security-Namespace, und Sie können die verschiedenen Annehmlichkeiten der Mitgliedschaft genießen, ohne sich um Details kümmern zu müssen. Werfen wir einen Blick auf die Prototypdefinition von Membership (statische Klasse): (Verwenden Sie den .NET Reflector von Lutz Roder, um alle seine Implementierungen anzuzeigen.)
public static class Membership
...{
// Events
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
// Methoden
static Membership();
public static MembershipUser CreateUser(string username, string passwort);
public static MembershipUser CreateUser(string username, string passwort, string email
);
PasswordQuestion, String PasswordAnswer, Bool isApproved, Out MembershipCreateStatus Status
)
;
public static bool DeleteUser(stringusername
, bool deleteAllRelatedData);
public static MembershipUserCollectionFindUsersByEmail(string emailToMatch);
public static MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, out int totalRecords);
public static MembershipUserCollection FindUsersByName(string usernameToMatch
;
,
out int totalRecords);private static
int GetNumberOfUsersOnline();
public
static
MembershipUser GetUser(bool userIsOnline)
;
GetUser
(
string username);
public
static
MembershipUser
(MembershipUser user);
public static bool ValidateUser(string username, string passwort);
// Eigenschaften
public static string ApplicationName ...{ get; }
public static bool EnablePasswordRetrieval ...
{
get
;
static bool IsHashAlgorithmFromMembershipConfig ...{ get; }
public static int MaxInvalidPasswordAttempts ...
{ get; }
public
static int MinRequiredPasswordLength ...{ get;
{ get; }
public static string PasswordStrengthRegularExpression ...{ get;
public static
MembershipProviderCollection Providers ...{ get
;public
static int UserIsOnlineTimeWindow ...{ get;
//
Fields
private
char
[
]
PUNKTURATIONEN
;
ers
;
}
Nachdem ich das gesagt habe, muss ich noch ein paar Worte sagen. Wenn Sie sich den Implementierungscode Membership (Static Class) ansehen, können Sie feststellen, dass jede Membersip-API-Überladung letztendlich die Methode des Attributs Provider aufruft. Nur wenn Sie dies sehen Vielleicht verstehen wir die wichtige Rolle von MembershipProvider. Es gibt auch ein Provider-Attribut, mit dem alle in web.config konfigurierten Mitgliedschaftsdienstklassen abgerufen werden können. Es sind alles statische Eigenschaften, aber wie werden sie instanziiert? Durch Aufrufen der Membership.Initialize()-Methode wird bei jedem Aufruf dieser beiden Eigenschaften diese Methode aufgerufen, um festzustellen, ob die von Membership bereitgestellte Dienstklasse initialisiert wurde. Andernfalls wird die Konfigurationsdienstklasse aufgerufen, um die Konfiguration zu lesen . Inhalt zum Initialisieren. An dieser Stelle fällt es Ihnen vielleicht nicht schwer zu verstehen, warum es für uns so einfach zu bedienen ist!
3. Einführung und Nutzungskonfiguration von SqlMembershipProvider
OK. Durch die obige Einführung sollten Sie in der Lage sein, die Gesamtstruktur der Mitgliedschaft grundsätzlich zu verstehen, oder? (Wenn Sie dies noch nicht getan haben, kann es sein, dass Sie den .NET Reflector von Lutz Roder noch nicht geöffnet haben, um seinen Implementierungscode zu analysieren, oder dass Sie die Rolle abstrakter Klassen noch nicht verstanden haben.) Egal was passiert, unser oberstes Ziel ist es, zu lernen, wie man es nutzt.
Zuvor möchte ich zunächst die beiden im .NET Framework bereitgestellten MembershipProvider-Implementierungsklassen vorstellen: ActiveDirectoryMembershipProvider und SqlMembershipProvider (Woher kennen Sie diese beiden Klassen? Sie können alle geerbten Klassen unter Abgeleitete Typen von MembershipProvider sehen.) Ersteres bietet Basisbenutzer Verwaltung unter Active Directory (ich habe es nicht geübt), und letzteres ist die von uns am häufigsten verwendete Benutzerverwaltungsimplementierung auf Basis von SqlServer.
Es ist an der Zeit, die Verwendung vorzustellen. Tatsächlich gibt es im Garten bereits Artikel dazu ((Übersetzung) Wie man die Mitgliedschaft in ASP.NET 2.0 verwendet), also werde ich keine weiteren Worte verschwenden. Aber hier möchte ich Ihnen den direktesten Weg erläutern, wie Sie es lernen und als Referenz verwenden können. Suchen und öffnen Sie machine.config auf der Systemfestplatte, suchen Sie den AspNetSqlMembershipProvider-Knoten und prüfen Sie, ob er angezeigt wird. Tatsächlich handelt es sich um die grundlegendste Mitgliedschaftskonfiguration, es fehlt jedoch die Angabe des Attributs defaultProvider. Sie können die Anmeldekontrolle verwenden. Es ist nicht erforderlich, einen Code zur Überprüfung der Benutzeranmeldung zu verwenden. Wenn Sie es nicht glauben, können Sie es versuchen. (Was die Formularüberprüfung betrifft, werde ich sie hier nicht vorstellen. Sie können auf relevante Informationen verweisen. Weitere Informationen zu SqlMembershipProvider finden Sie unter MSDN.)
4. So passen Sie MembershipProvider und andere vorhandene MembershipProvider-Ressourcen an
Wie passen wir also einen MembershipProvider an? Wenn Sie die Struktur von Membership bereits verstehen, glaube ich, dass es für Sie nicht schwierig ist, wenn man bedenkt, dass es immer noch ein gewisser Arbeitsaufwand und eine gewisse Schwierigkeit ist, einen vollständigen MembershipProvider zu schreiben. Für uns besteht möglicherweise die Möglichkeit, vorhandene Provider an weiteren Orten zu erweitern, z. B. SqlMembershipProvider. Tatsächlich ist dies sehr einfach. Wir müssen nur von SqlMembershipProvider erben (sagen wir Ihnen ruhig, was im Konfigurationsparameter der Initialize-Methode gespeichert ist, ist der Attributname und der Wert des entsprechenden Konfigurationsabschnitts des Providers) und dann erweitern Schreiben Sie die erforderlichen Methoden neu. Wenn Sie es verwenden, ändern Sie im Abschnitt „Provider-Konfiguration“ den Wert von „type“ in Ihren Klassennamen und es ist in Ordnung.
Schließlich gibt es bereits viele MembershipProvider in verschiedenen Umgebungen auf dem Markt, wie zum Beispiel MySQL, Oracle usw. Hier ist die Implementierung von MySQL: http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp . Ich glaube, Sie können weitere Hilfe von Google finden.
Okay, ich habe zu viel gesagt, ich hoffe, es kann Ihnen, die Sie sich die Mühe gemacht haben, diesen Blog zu lesen, hilfreich sein.