Gewusst wie: Zugreifen auf SQL Server mit integrierter Windows-Sicherheit

Aktualisiert: November 2007

Wenn Ihre Anwendung in einem Windows-basierten Intranet ausgeführt wird, können Sie für den Datenbankzugriff die integrierte Windows-Authentifizierung verwenden. Die integrierte Sicherheit verwendet die aktuelle Windows-Identität des Betriebssystemthreads, um auf die SQL Server-Datenbank zuzugreifen. Sie können dann der Windows-Identität eine SQL Server-Datenbank und SQL Server-Berechtigungen zuordnen.

Um die Verbindung mit SQL Server mithilfe der integrierten Windows-Authentifizierung herzustellen, müssen Sie die Windows-Identität ermitteln, unter der die ASP.NET-Anwendung ausgeführt wird. Sie müssen auch sicherstellen, dass der Identität Zugriff auf die SQL Server-Datenbank gewährt wurde. Dieses Thema enthält ein Codebeispiel, in dem die aktuelle Windows-Identität der ASP.NET-Anwendung angezeigt wird.

Verbinden mit SQL Server

Wenn sich SQL Server auf einem anderen Computer als dem Webserver befindet, muss die Windows-Identität in der Lage sein, durch das Netzwerk bis zu der Remoteinstanz von SQL Server zu gelangen. (Windows-Netzwerke, die dementsprechend mit der Kerberos-Authentifizierung konfiguriert wurden, sind dazu imstande.) Je nach den Festlegungen im identity-Konfigurationselement ist die Windows-Identität, die auf dem Betriebssystemthread für ASP.NET-Anwendungen eingerichtet wurde, möglicherweise nicht imstande, ordnungsgemäß zum SQL-Remoteserver zu gelangen.

Sie können einen speziellen Benutzernamen und ein spezielles Kennwort für die Workerprozessidentität der Website eingeben, wie in Gewusst wie: Zugreifen auf SQL Server mit einem zugeordneten Windows-Domänenbenutzer gezeigt, oder Sie können die von IIS (Internetinformationsdienste) bereitgestellte authentifizierte Identität imitieren. Um die von IIS bereitgestellte Windows-Identität zu imitieren, legen Sie das impersonate-Attribut des identity-Konfigurationselements auf true fest, wie im folgenden Beispiel gezeigt:

<system.web>
  <identity impersonate="true" />
</system.web>

In IIS werden nur bei der Standardauthentifizierung Benutzer mit einem Sicherheitstoken angemeldet, das durch das Netzwerk bis zu dem SQL-Remoteserver gelangt. Standardmäßig wird bei anderen IIS-Sicherheitsmodi, die in Verbindung mit den Einstellungen für das identity-Konfigurationselement verwendet werden, kein Token erstellt, das bei einem SQL-Remoteserver die Authentifizierung vornehmen kann.

Wenn die Website so konfiguriert wurde, dass sie nur den anonymen Zugriff in IIS unterstützt, handelt es sich bei dem von IIS übergebenen Sicherheitstoken um das in IIS konfigurierte Sicherheitstoken des Windows-Benutzerkontos für anonymen Zugriff. Das anonyme Benutzerkonto kann zum Authentifizieren bei einem SQL-Remoteserver verwendet werden. Allerdings handelt es sich bei dem anonymen Benutzerkonto um ein lokales Computerkonto, das folglich auf dem SQL-Remoteserver nicht als Konto vorhanden ist. Sie können das anonyme IIS-Konto ändern, um es als Domänenkonto zu verwenden, oder Sie können das lokale Computerkonto auf dem SQL-Remoteserver spiegeln, indem Sie auf dem SQL-Remoteserver ein lokales Konto mit demselben Benutzernamen und demselben Kennwort erstellen. Zusätzlich muss die LogonMethod -Metabasiseigenschaft für IIS6 auf eine Option festgelegt werden, die es ermöglicht, Anmeldeinformationen durch das Netzwerk zu senden. Beispielsweise ermöglicht die Metabasiseinstellung MD_LOGON_NETWORK_CLEARTEXT, dass Anmeldeinformationen durch das Netzwerk gesendet werden.

Wenn Sie hinsichtlich der Windows-Identität Ihrer Anwendung unsicher sind und nicht wissen, ob die Identität mit einem Token angemeldet wurde, das durch das Netzwerk gesendet werden kann, können Sie die folgende ASP.NET-Seite als Teil Ihrer Anwendung ausführen, um den Namen der Windows-Identität und einen Wert anzuzeigen, die angeben, ob die Identität durch das Netzwerk gesendet werden kann. Beachten Sie, dass bei dem folgenden Beispiel nicht berücksichtigt wird, ob für Ihre Domäne die Kerberos-Delegierung erfolgreich eingerichtet wurde.

<%@ Page Language="VB" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>ASP.NET Example</title>
<script >

Public Function WillFlowAcrossNetwork(w As WindowsIdentity) As Boolean
  For Each s As SecurityIdentifier In w.Groups
    If s.IsWellKnown(WellKnownSidType.InteractiveSid) Then Return True
    If s.IsWellKnown(WellKnownSidType.BatchSid)       Then Return True
    If s.IsWellKnown(WellKnownSidType.ServiceSid)     Then Return True
  Next

  Return False
End Function

</script>
</head>
<body>
<%
  Dim current As WindowsIdentity =  WindowsIdentity.GetCurrent()
  Response.Write(current.Name & ", " & WillFlowAcrossNetwork(current) & "<br />")
%>
</body>
</html>
<%@ Page Language="C#" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>ASP.NET Example</title>
<script >

public bool WillFlowAcrossNetwork(WindowsIdentity w)
{
  foreach (SecurityIdentifier s in w.Groups)
  {
    if (s.IsWellKnown(WellKnownSidType.InteractiveSid)) { return true; }
    if (s.IsWellKnown(WellKnownSidType.BatchSid))       { return true; }
    if (s.IsWellKnown(WellKnownSidType.ServiceSid))     { return true; }
  }

  return false;
}

</script>
</head>
<body>
<%
  WindowsIdentity current =  WindowsIdentity.GetCurrent();
  Response.Write(current.Name + ", " + WillFlowAcrossNetwork(current) + "<br />");
%>
</body>
</html>

In der folgenden Prozedur wird gezeigt, wie Sie mithilfe der integrierten Windows-Authentifizierung in einem Intranetszenario auf eine SQL Server-Datenbank zugreifen, bei der jedem Benutzer einzeln Zugriff auf SQL Server gewährt wurde.

Zunächst müssen Sie für die Anwendung in IIS den anonymen Zugriff deaktivieren. Aktivieren Sie stattdessen die Windows-Authentifizierung.

So konfigurieren Sie IIS für die integrierte Windows-Authentifizierung

  1. Öffnen Sie unter Windows das Verwaltungstool Internetinformationsdienste.

    • Zeigen Sie unter Microsoft Windows 2000 Server oder Windows Server 2003 im Menü Start auf Programme, dann auf Verwaltung und anschließend auf Internetdienste-Manager.

    • Öffnen Sie unter Microsoft Windows XP Professional in der Systemsteuerung die Verwaltung.

  2. Öffnen Sie den Knoten für den Server. Erweitern Sie dann die untergeordneten Knoten, bis der Knoten für die Anwendung angezeigt wird. In der Regel befindet dieser sich unter Standardwebsite.

  3. Klicken Sie mit der rechten Maustaste auf die Anwendung, und klicken Sie auf Eigenschaften.

  4. Klicken Sie auf der Registerkarte Verzeichnissicherheit auf Bearbeiten.

  5. Deaktivieren Sie im Dialogfeld Authentifizierungsmethoden das Kontrollkästchen Anonymer Zugriff, und führen Sie dann einen der folgenden Schritte durch:

    • Wenn SQL Server und IIS auf dem gleichen Computer installiert sind, aktivieren Sie das Kontrollkästchen Integrierte Windows-Authentifizierung.

    • Wenn der SQL-Server ein Remoteserver ist, aktivieren Sie das Kontrollkästchen Standardauthentifizierung, und deaktivieren Sie das Kontrollkästchen Integrierte Windows-Authentifizierung.

  6. Klicken Sie auf alle Dialogfelder.

Geben Sie in der Konfigurationsdatei der Anwendung (Web.config) an, dass die Anwendung die von IIS bereitgestellten Anmeldeinformationen des Benutzers imitiert.

So konfigurieren Sie die Datei Web.config, um die von IIS bereitgestellte Identität zu imitieren

  • Öffnen Sie die Datei Web.config für Ihre Anwendung, und fügen Sie ihr das folgende system.web-Element hinzu:

    <identity impersonate="true"/>
    
    Hinweis:

    Bei Elementen in Web.config wird die Groß-/Kleinschreibung beachtet.

Beim Erstellen von Verbindungszeichenfolgen für den Zugriff auf SQL Server müssen Sie Attribute hinzufügen, aus denen SQL Server ersehen kann, dass Sie die integrierte Sicherheit verwenden.

So konfigurieren Sie Verbindungszeichenfolgen für die integrierte Sicherheit von Windows

  • Fügen Sie einer beliebigen Verbindungszeichenfolge für SQL Server das Attribut Trusted_Connection=Yes hinzu, und entfernen Sie die Attribute für den Benutzernamen und das Kennwort.

    Nachstehend finden Sie eine typische für die integrierte Sicherheit von Windows konfigurierte Verbindungszeichenfolge:

    "workstation id=WebServer1;packet size=4096;
    Trusted_Connection=Yes;data source=SQLServer01";
    persist security info=False;initial catalog=northwind"
    

Richten Sie SQL Server so ein, dass darauf zugreifende Benutzer erkannt werden.

So konfigurieren Sie SQL Server für die integrierte Sicherheit von Windows

  1. Wählen Sie im Windows-Menü Start die Option Microsoft SQL Server und anschließend Enterprise Manager aus.

  2. Öffnen Sie den Serverknoten, und erweitern Sie den Knoten der Datenbank, für die Sie dem Benutzer Berechtigungen gewähren möchten.

  3. Klicken Sie mit der rechten Maustaste auf den Knoten Benutzer, und wählen Sie den Eintrag Neuer Datenbankbenutzer aus.

  4. Geben Sie im Dialogfeld Eigenschaften für den Datenbankbenutzer im Feld Benutzername die Zeichenfolge Domäne\Benutzername ein, und klicken Sie dann auf OK. Zusätzlich können Sie SQL Server so konfigurieren, dass allen Domänenbenutzern der Zugriff auf die Datenbank gewährt wird.

Siehe auch

Konzepte

Identitätswechsel in ASP.NET

Zugreifen auf SQL Server von einer Webanwendung aus

Weitere Ressourcen

Sichern von ASP.NET-Websites