Wozu das Ganze?
Nützlich ist es zum Beispiel immer dann, wenn man etwa bestehende Kunden- oder Login-Daten, etwa in Form einer SQL-Server-Tabelle vorliegen hat, und diese nun für einen Benutzerlogin nutzen will. Da bietet es sich ja förmlich an, oder anders ausgedrückt, es wäre sträflich die vorhandenen ASP.NET-Login-Controls nicht zu benutzen. Die sind nämlich so gut, dass sich damit viel handgestrickter Murks und vor allem Arbeit vermeiden lässt.
Das Problem ist jetzt nur, dass ASP.NET mit vielen eigenen Tabellen, Stored Procedures, Views usw. anrückt, die prinzipiell erstmal nicht mit den bestehenden Userdaten kommunizieren. Nun kann man sich die Frage stellen, ob man für einen simplen Login diesen ganzen Overhead benötigt.
Wenn man sich die Frage mit nein beantworten kann, dann bietet es sich in jedem Fall an, einen Custom MembershipProvider zu schreiben. Damit kann man dann auf die ASP.NET-Datenbank-Objekte verzichten und als Datenquelle direkt und ohne Umwege die eigene Kundentabelle benutzen. Das geht auf jeden Fall schneller, als ein Abgleich der Daten zw. ASP.NET-Tabellen und der eigenen, etwa per Trigger.
Wie geht es?
Relativ einfach. Als erstes legt man sich eine neue Klasse an, und leitet diese von MembershipProvider ab. Anschließend schiebt man seinen Mauszeiger geschmeidig über den Namen der Basisklasse und wartet kurz, bis sich folgendes Popup-Menü zeigt:
Ein Klick darauf implementiert alle Properties und Methoden, die überschrieben werden können. Das schaut auf den ersten Blick erstmal nach richtig viel Arbeit aus. Aber keine Bange, für einen einfachen Login benötigt man im ersten Schritt tatsächlich nur eine einzige Methode: ValidateUser. Diese wird vom Login-Control aufgerufen:
public override bool ValidateUser(string username, string password)
{
bool returnValue = false;
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["XYZ"].ConnectionString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = connection;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Select Count(*) From KundenTabelle Where Login = @username AND Passwort = @password";
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@password", password);
connection.Open();
object result = cmd.ExecuteScalar();
if (result != null)
if ((int)result == 1)
returnValue = true;
}
}
return returnValue;
}
Dann muss natürlich noch das Login-Control irgendwo platziet werden:
Darunter habe ich zu Testzwecken noch ein LoginStatus-Control platziert, damit man gleich sieht ob man angemeldet ist oder nicht ...
Und last but not least muss der eigene MemberShipProvider natürlich noch in der Web.config registriert werden:
"MyMembershipProvider" userIsOnlineTimeWindow="20">
"MyMembershipProvider" type="MyMembershipProvider"/>
Zudem darf man nicht vergessen die Authentication-Art von Windows auf Forms umzustellen:
"Forms">
"AutoDetect" protection="All" slidingExpiration="true"
defaultUrl="~/Default.aspx" loginUrl="~/Default.aspx" />
Fertig
War einfach, oder? Für alle die es nicht glauben, hier ein Beispielprojekt (benötigt das .NET Framework 2.0 und SQL Server Express):
MyMembershipProvider.zip (187,74 KB)