Implementieren formularbasierter Authentifizierung in ASP.NET-Anwendungen mit Hilfe von C#.NET

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 301240 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D301240
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Beitrag beschreibt das Implementieren formularbasierter Authentifizierung unter Verwendung einer Datenbank zum Speichern der Benutzer.

Voraussetzungen

Die folgenden Liste führt die empfohlene Hardware, Software und Netzwerkinfrastruktur sowie die benötigten Service Packs auf:
  • Microsoft Visual Studio .NET
  • Microsoft Internet Information Services (IIS) 5.0 oder höher
  • Microsoft SQL Server

Erstellen einer ASP.NET-Anwendung mit C# .NET

  1. Öffnen Sie Visual Studio .NET.
  2. Erstellen Sie eine neue ASP.NET-Webanwendung, und geben Sie Namen und Speicherort an.

Konfigurieren der Sicherheitseinstellungen in der Datei "Web.config"

Dieser Abschnitt zeigt das Hinzufügen und Bearbeiten der Konfigurationsabschnitte <authentication> und <authorization> zum Konfigurieren der ASP.NET-Anwendung für die Verwendung formularbasierter Authentifizierung.
  1. Öffnen Sie die Datei "Web.config" im Projektmappen-Explorer.
  2. Ändern Sie den Authentifizierungsmodus in Formulare.
  3. Fügen Sie das <Forms>-Tag ein, und füllen Sie die entsprechenden Attribute mit Werten. (Weitere Informationen über diese Attribute finden Sie in der MSDN-Dokumentation oder in der QuickStart-Dokumentation, die im Abschnitt Informationsquellen aufgelistet ist.) Kopieren Sie den folgenden Code, und klicken Sie anschließend im Menü Bearbeiten auf Als HTML einfügen, um den Code in den Abschnitt <authentication> der folgenden Datei einzufügen:
    <authentication mode="Forms">
       <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
       protection="All" path="/" timeout="30" />
    </authentication> 
    					
  4. Verweigern Sie dem anonymen Benutzer auf folgende Weise den Zugriff im Abschnitt <authorization>:
    <authorization>
       <deny users ="?" />
       <allow users = "*" />
    </authorization>
    					

Erstellen einer Datenbank-Beispieltabelle zum Speichern von Benutzerdetails

Dieser Abschnitt zeigt das Erstellen einer Beispieldatenbank zum Speichern des Benutzernamens, des Kennworts und der Rolle für die Benutzer. Sie benötigen die Rollenspalte, wenn Sie Benutzerrollen in der Datenbank speichern und rollenbasierte Sicherheit implementieren möchten.
  1. Klicken Sie im Menü Start auf Ausführen, und geben Sie anschließend notepad ein, um den Editor zu öffnen.
  2. Markieren Sie den folgenden SQL-Skriptcode, klicken Sie mit der rechten Maustaste auf den Code, und klicken Sie dann auf Kopieren. Klicken Sie im Editor im Menü Bearbeiten auf Einfügen, um den folgenden Code einzufügen:
    if exists (select * from sysobjects where id = 
    object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Users]
    GO
    CREATE TABLE [dbo].[Users] (
       [uname] [varchar] (15) NOT NULL ,
       [Pwd] [varchar] (25) NOT NULL ,
       [userRole] [varchar] (25) NOT NULL ,
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
       CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 
       (
          [uname]
       ) ON [PRIMARY] 
    GO
    
    INSERT INTO Users values('user1','user1','Manager')
    INSERT INTO Users values('user2','user2','Admin')
    INSERT INTO Users values('user3','user3','User')
    GO
    					
  3. Speichern Sie die Datei unter dem Namen "Users.sql".
  4. Öffnen Sie die Datei "Users.sql" auf dem Microsoft SQL Server-Computer im Query Analyzer. Klicken Sie in der Liste der Datenbanken auf pubs, und führen Sie das Skript aus. Es wird eine Benutzerbeispieltabelle erstellt, und die Tabelle in der Pubs-Datenbank wird mit Daten aufgefüllt, die in dieser Beispielanwendung verwendet werden.

Erstellen einer Seite "Logon.aspx"

  1. Fügen Sie zu dem Projekt ein neues Webformular namens "Logon.aspx" hinzu.
  2. Öffnen Sie die Seite "Logon.aspx" im Editor, und wechseln Sie dann in die HTML-Ansicht.
  3. Kopieren Sie den folgenden Code, und verwenden Sie dann im Menü Bearbeiten die Option Als HTML einfügen, um den Code zwischen den <form>-Tags einzufügen:
    <h3>
       <font face="Verdana">Logon Page</font>
    </h3>
    <table>
       <tr>
          <td>Email:</td>
          <td><input id="txtUserName" type="text" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
               Display="Static" ErrorMessage="*" runat="server" 
               ID="vUserName" /></td>
       </tr>
       <tr>
          <td>Password:</td>
          <td><input id="txtUserPass" type="password" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
              Display="Static" ErrorMessage="*" runat="server" 
              ID="vUserPass" />
          </td>
       </tr>
       <tr>
          <td>Persistent Cookie:</td>
          <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>
          <td></td>
       </tr>
    </table>
    <input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
    <asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />
    						
    Dieses Webformular wird zum Bereitstellen eines Anmeldeformulars für Benutzer verwendet, damit diese den Benutzernamen und das Kennwort bereitstellen können, um sich bei der Anwendung anzumelden.
  4. Wechseln Sie in die Entwurfsansicht, und speichern Sie dann die Seite.

Codieren der Ereignisbehandlungsroutine zum Überprüfen der Benutzeranmeldeinformationen

Dieser Abschnitt stellt den Code vor, der in der CodeBehind-Seite ("Logon.aspx.cs") platziert wird.
  1. Doppelklicken Sie auf Logon, um die Datei "Logon.aspx.cs" zu öffnen.
  2. Importieren Sie die erforderlichen Namespaces in die CodeBehind-Datei:
    using System.Data.SqlClient;
    using System.Web.Security;
    					
  3. Erstellen Sie eine Funktion ValidateUser zum Überprüfen der Benutzeranmeldeinformationen durch Durchsuchen der Datenbank. (Stellen Sie sicher, dass Sie die Verbindungszeichenfolge so ändern, dass sie auf Ihre Datenbank verweist.)
    private bool ValidateUser( string userName, string passWord )
    {
    	SqlConnection conn;
    	SqlCommand cmd;
    	string lookupPassword = null;
    
    	// Gültigkeitsprüfung für userName.
    	// userName darf nicht Null sein und muss zwischen 1 und 15 Zeichen lang sein.
    	if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
    		return false;
    	}
    
    	// Gültigkeitsprüfung für passWord.
    	// passWord darf nicht Null sein und muss zwischen 1 und 25 Zeichen lang sein.
    	if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
    		return false;
    	}
    
    	try
    	{
    		// Wenn Sie sich wegen einer geeigneten Verbindungszeichenfolge für die Verbindung
    		// zu Ihrem lokalen SQL Server an Ihren  SQL Server-Administrator .
    		conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
    		conn.Open();
    
    		// Create SqlCommand to select pwd field from users table given supplied userName.
    		cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
    		cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
    		cmd.Parameters["@userName"].Value = userName;
    
    		// Befehl ausführen und Pwd-Feld abrufen und in lookupPassword-Zeichenfolge einsetzen.
    		lookupPassword = (string) cmd.ExecuteScalar();
    
    		// Cleanup command and connection objects.
    		cmd.Dispose();
    		conn.Dispose();
    	}
    	catch ( Exception ex )
    	{
    		// Hier Fehlerbehandlung für das Debuggen hinzufügen.
    		// Diese Fehlermeldung sollte nicht an den Aufrufer zurückgesendet werden.
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
    	}
    
    	// Wenn kein Kennwort gefunden wird, False zurückgeben.
    	if ( null == lookupPassword ) 
    	{
    		// Hier könnten Sie zwecks zusätzlicher Sicherheit fehlgeschlagene Anmeldeversuche ins Ereignisprotokoll schreiben.
    		return false;
    	}
    
    	// Vergleichen von lookupPassword und eingegebenem passWord mit Beachtung von Groß-/Kleinschreibung.
    	return ( 0 == string.Compare( lookupPassword, passWord, false ) );
    
    }
    					
  4. Sie können eine von zwei Methoden zum Generieren des Formularauthentifizierungscookies verwenden und den Benutzer im Ereignis cmdLogin_ServerClick an eine entsprechende Seite umleiten. Beispielcode wird für beide Szenarien zur Verfügung gestellt. Verwenden Sie die Methode, die Ihren Anforderungen entspricht.
    • Rufen Sie die Methode RedirectFromLoginPage zum automatischen Generieren des Formularauthentifizierungscookies und zum Umleiten des Benutzers im Ereignis cmdLogin_ServerClick an eine entsprechende Seite auf:
      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
      if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
      	FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,
      		chkPersistCookie.Checked);
      	else
      		Response.Redirect("logon.aspx", true);
      }
      						
    • Generieren Sie das Authentifizierungsticket, verschlüsseln Sie es, erstellen Sie ein Cookie, fügen Sie dieses zu der Antwort hinzu, und leiten Sie dann den Benutzer um. Sie erhalten auf diese Weise eine bessere Kontrolle über die Art der Cookieerstellung. Sie können in diesem Fall auch benutzerdefinierte Daten in das FormsAuthenticationTicket einschließen.
      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
         if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
         {
            FormsAuthenticationTicket tkt;
            string cookiestr;
            HttpCookie ck;
            tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, 
      DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");
            cookiestr = FormsAuthentication.Encrypt(tkt);
            ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);
            if (chkPersistCookie.Checked)
            ck.Expires=tkt.Expiration;	
      		    ck.Path = FormsAuthentication.FormsCookiePath; 
            Response.Cookies.Add(ck);
      
            string strRedirect;
            strRedirect = Request["ReturnUrl"];
            if (strRedirect==null)
                  strRedirect = "default.aspx";
               Response.Redirect(strRedirect, true);
         }
         else
            Response.Redirect("logon.aspx", true);
      }
      						
  5. Stellen Sie sicher, dass der folgende Code der Methode InitializeComponent in dem vom Webformular-Designer generierten Code hinzugefügt wird:
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
    					

Erstellen einer Seite "Default.aspx"

Dieser Abschnitt beschreibt das Erstellen einer Testseite, an die Benutzer nach der Authentifizierung umgeleitet werden. Wenn Benutzer zu dieser Seite wechseln, ohne sich zuvor bei der Anwendung angemeldet zu haben, werden sie an die Anmeldeseite umgeleitet.
  1. Benennen Sie die vorhandene Seite "WebForm1.aspx" in "Default.aspx" um, und öffnen Sie diese dann im Editor.
  2. Wechseln Sie in die HTML-Ansicht, und kopieren Sie dann den folgenden Code zwischen die <form>-Tags:
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    						
    Diese Schaltfläche wird zum Abmelden der Formularauthentifizierungssitzung verwendet.
  3. Wechseln Sie in die Entwurfsansicht, und speichern Sie dann die Seite.
  4. Importieren Sie die erforderlichen Namespaces in die CodeBehind-Datei:
    using System.Web.Security;
    					
  5. Doppelklicken Sie auf SignOut, um die CodeBehind-Seite zu öffnen ("Default.aspx.cs"), und kopieren Sie den folgenden Code in den cmdSignOut_ServerClick-Ereignishandler:
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
       FormsAuthentication.SignOut();
       Response.Redirect("logon.aspx", true);
    }
    					
  6. Stellen Sie sicher, dass der folgende Code der Methode InitializeComponent in dem vom Webformular-Designer generierten Code hinzugefügt wird:
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    					
  7. Speichern und kompilieren Sie das Projekt. Sie können die Anwendung nun verwenden.

Zusätzliche Hinweise

  • Sie möchten Kennwörter möglicherweise sicher in einer Datenbank speichern. Sie können die Dienstprogrammfunktion namens HashPasswordForStoringInConfigFile der Klasse FormsAuthentication zum Verschlüsseln der Kennwörter verwenden, bevor Sie diese in der Datenbank oder Konfigurationsdatei speichern.
  • Sie können die SQL-Verbindungsinformationen in der Konfigurationsdatei ("Web.config") speichern, damit Sie diese bei Bedarf auf einfache Weise ändern können.
  • Außerdem können Sie ggf. Code hinzufügen, der verhindert, dass sich Hacker anmelden können, die verschiedene Kennwortkombinationen verwenden. Sie können z. B. Programmlogik integrieren, die nur zwei oder drei Anmeldeversuche gestattet. Wenn sich ein Benutzer mit einer bestimmten Anzahl von Anmeldeversuchen nicht anmelden kann, können Sie ein Flag in der Datenbank einrichten, das dem Benutzer die Anmeldung verweigert, bis dieser sein Konto erneut durch Besuchen einer anderen Seite oder durch Kontaktaufnahme mit Ihrem Support aktiviert. Außerdem sollten Sie entsprechende Fehlerbehandlung vorsehen, wo dies erforderlich ist.
  • Da der Benutzer basierend auf dem Authentifizierungscookie identifiziert wird, können Sie SSL (Secure Sockets Layer) für die Anwendung verwenden, damit niemand das Authentifizierungscookie oder andere wichtige Informationen abfangen kann, die übertragen werden.
  • Formularbasierte Authentifizierung verlangt, dass der Client Cookies im Browser annimmt oder aktiviert.
  • Der Parameter timeout des Konfigurationsabschnitts <authentication> steuert das Intervall, in dem das Authentifizierungscookie erneut generiert wird. Sie können einen Wert wählen, der bessere Leistung und Sicherheit gewährleistet.
  • Bestimmte zwischengeschaltete Proxys und Caches im Internet können Webserverantworten zwischenspeichern, die Set-Cookie-Kopfzeilen enthalten und anschließend möglicherweise an einen anderen Benutzer zurückgegeben werden. Da die formularbasierte Authentifizierung ein Cookie zum Authentifizieren von Benutzern verwendet, kann es vorkommen, dass ein Benutzer zufällig (oder absichtlich) die Identität eines anderen Benutzers annimmt, indem ein Cookie von einem zwischengeschalteten Proxy oder Cache empfangen wird, das ursprünglich nicht für diesen Benutzer gedacht war.

Informationsquellen

Weitere Informationen über das Implementieren einer einfachen formularbasierten Authentifizierung, die den Abschnitt <credentials> zum Speichern von Benutzern und Kennwörtern verwendet, finden Sie im folgenden Beispiel zu GotDotNet ASP.NET QuickStart:
Forms-Based Authentication (Formularbasierte Authentifizierung)
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx
Weitere Informationen zum Implementieren einer formularbasierten Authentifizierung, die eine XML-Datei zum Speichern von Benutzern und Kennwörtern verwendet, finden Sie im folgenden Thema in der Dokumentation zum .NET-Framework-SDK (Software Development Kit):
Forms Authentication Using An XML Users File (Formularauthentifizierung mithilfe einer XML-Benutzerdatei)
http://msdn.microsoft.com/de-de/library/1b1y85bh(vs.71).aspx
Weitere Informationen über Sicherheit bei ASP.NET-Webanwendungen finden Sie in der folgenden Dokumentation im Microsoft .NET-Framework-Entwicklerhandbuch:
ASP.NET Web Application Security (Sicherheit von ASP.NET-Webanwendungen)
http://msdn.microsoft.com/de-de/library/330a99hc(vs.71).aspx
Weitere Informationen über den Namespace System.Web.Security finden Sie in der folgenden Dokumentation der Microsoft .NET-Framework-Referenz:
System.Web.Security Namespace (Der Namespace "System.Web.Security")
http://msdn.microsoft.com/de-de/library/system.web.security(vs.71).aspx
Weitere Informationen über die ASP.NET-Konfiguration finden Sie in den folgenden Artikeln im Microsoft .NET-Framework-Entwicklerhandbuch:
ASP.NET Configuration (ASP.NET-Konfiguration)
http://msdn.microsoft.com/de-de/library/aa719558(VS.71).aspx

ASP.NET-Konfigurationsabschnitte
http://msdn.microsoft.com/de-de/library/w7w4sb0w(vs.71).aspx
Weitere Informationen über die ASP.NET-Sicherheitsrichtlinien finden Sie im folgenden MSDN-Whitepaper:
Authentifizierung in ASP.NET: .NET-Sicherheitsleitfaden
http://msdn.microsoft.com/de-de/library/ms978378.aspx
For more general information about ASP.NET, refer to the following MSDN newsgroup:
microsoft.public.dotnet.framework.aspnet
Hinweis Dies ist ein Artikel, der im Schnellverfahren direkt von der Microsoft-Supportorganisation erstellt wurde. Die hierin enthaltenen Informationen werden als Reaktion auf neue Probleme wie besehen bereitgestellt. Da dieser Artikel im Schnellverfahren erstellt wurde, kann er Tippfehler enthalten und zu einem späteren Zeitpunkt ohne vorherige Ankündigung überarbeitet werden. Weitere zu berücksichtigende Informationen finden Sie in den Nutzungsbedingungen.

Eigenschaften

Artikel-ID: 301240 - Geändert am: Freitag, 29. Juni 2012 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 64-Bit Edition
Keywords: 
kbconfig kbhowtomaster kbsecurity kbweb KB301240
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns