Comment : accéder à SQL Server à l'aide de la sécurité intégrée de Windows

Mise à jour : novembre 2007

Si votre application est exécutée sur un intranet Windows, vous pouvez peut-être utiliser l'authentification intégrée de Windows pour l'accès aux bases de données. La sécurité intégrée utilise l'identité Windows actuelle établie sur le thread du système d'exploitation pour accéder à la base de données SQL Server. Vous pouvez ensuite mapper l'identité Windows à une base de données et à des autorisations SQL Server.

Pour vous connecter à SQL Server à l'aide de l'authentification intégrée de Windows, vous devez identifier l'identité Windows que votre application ASP.NET utilise pour s'exécuter. Vous devez également vous assurer que l'identité a reçu l'autorisation d'accéder à la base de données SQL Server. Cette rubrique inclut un exemple de code qui affiche l'identité Windows actuelle de l'application ASP.NET.

Connexion à SQL Server

Si SQL Server est sur un ordinateur autre que le serveur Web, l'identité Windows doit pouvoir parcourir le réseau jusqu'à l'instance distante de SQL Server. (Les réseaux Windows qui ont été correctement configurés avec l'authentification Kerberos sont capables d'agir ainsi.) Toutefois, selon les paramètres de l'élément de configuration identity, l'identité Windows établie sur le thread du système d'exploitation pour les applications ASP.NET ne peut peut-être pas atteindre correctement le SQL Server distant.

Vous pouvez fournir un nom d'utilisateur et un mot de passe spécifiques pour l'identité du processus de traitement du site Web, comme indiqué dans Comment : accéder à SQL Server à l'aide d'un utilisateur de domaine Windows mappé, ou vous pouvez emprunter l'identité authentifiée fournie par les services IIS (Internet Information Services). Pour emprunter l'identité Windows fournie par IIS, affectez la valeur true à l'attribut impersonate de l'élément de configuration identity, comme indiqué dans l'exemple suivant :

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

Dans IIS, seule l'Authentification de base permet d'ouvrir une session utilisateur avec un jeton de sécurité qui parcourt le réseau jusqu'à un SQL Server distant. Par défaut, d'autres modes de sécurité IIS utilisés conjointement aux paramètres de l'élément de configuration identity ne résultent pas en un jeton qui ne peut pas s'authentifier sur un SQL Server distant.

Si le site Web est configuré pour prendre en charge uniquement les accès anonymes à IIS, le jeton de sécurité transmis par IIS sera celui du compte d'utilisateur Windows pour les accès anonymes, comme configuré dans IIS. Le compte d'utilisateur anonyme peut être utilisé pour effectuer une authentification auprès d'un SQL Server distant. Toutefois, le compte d'utilisateur anonyme par défaut est un compte d'ordinateur local et n'existera donc pas en tant que compte sur le SQL Server distant. Vous pouvez modifier le compte anonyme d'IIS pour utiliser un compte de domaine, ou vous pouvez refléter le compte d'ordinateur local sur le SQL Server distant en créant un compte local sur le SQL Server distant avec les mêmes nom d'utilisateur et mot de passe. En outre, vous devez affecter à la propriété de métabase LogonMethod pour IIS6 une option qui permet aux informations d'identification de parcourir le réseau. Par exemple, le paramètre de métabase MD_LOGON_NETWORK_CLEARTEXT permet aux informations d'identification d'ouverture de session de parcourir le réseau.

Si vous n'êtes pas sûr de l'identité Windows de votre application et si cette identité est connectée avec un jeton qui peut parcourir le réseau, vous pouvez exécuter la page ASP.NET suivante dans le cadre de votre application pour afficher le nom de l'identité Windows ainsi qu'une valeur indiquant si l'identité peut parcourir le réseau. Notez que l'exemple suivant ne prend pas en considération le succès ou l'échec de l'installation de la délégation Kerberos pour votre domaine.

<%@ 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>

La procédure suivante montre comment accéder à une base de données SQL Server à l'aide de l'authentification intégrée de Windows dans un scénario d'intranet dans lequel chaque utilisateur a été autorisé individuellement à accéder à SQL Server.

Pour commencer, vous devez configurer votre application dans IIS afin de désactiver l'accès anonyme et d'activer l'authentification Windows.

Pour configurer IIS pour l'authentification intégrée de Windows

  1. Dans Windows, ouvrez l'outil d'administration Services ISS (Internet Information Services).

    • Dans les systèmes d'exploitation Microsoft Windows 2000 Server ou Windows Server 2003 : dans le menu Démarrer de Windows, pointez sur Programmes, sur Outils d'administration, puis sur Gestionnaire des services IIS.

    • Dans le système d'exploitation Microsoft Windows XP Professionnel : ouvrez Outils d'administration dans le Panneau de configuration.

  2. Ouvrez le nœud de votre serveur, puis développez autant de nœuds que nécessaire pour trouver celui de votre application, généralement situé sous Site Web par défaut.

  3. Cliquez avec le bouton droit sur votre application, puis cliquez sur Propriétés.

  4. Sous l'onglet Sécurité du répertoire, cliquez sur Modifier.

  5. Dans la boîte de dialogue Méthodes d'authentification, désactivez la case à cocher Accès anonyme, puis effectuez l'une des actions suivantes :

    • Si SQL Server est sur le même ordinateur qu'IIS, activez la case à cocher Authentification Windows intégrée.

    • Si SQL Server est un serveur distant, activez la case à cocher Authentification de base et désactivez la case à cocher Authentification Windows intégrée.

  6. Cliquez sur toutes les boîtes de dialogue.

Dans le fichier de configuration de l'application (Web.config), spécifiez que l'application empruntera les informations d'identification de l'utilisateur fournies par IIS.

Pour configurer Web.config afin qu'il emprunte l'identité fournie par IIS

  • Ouvrez le fichier Web.config de votre application et ajoutez-y les éléments system.web suivants :

    <identity impersonate="true"/>
    
    Remarque :

    Dans Web.config, les éléments respectent la casse.

Lorsque vous créez une chaîne de connexion pour accéder à SQL Server, vous devez inclure des attributs indiquant à SQL Server que vous utilisez la sécurité intégrée.

Pour configurer des chaînes de connexion pour la sécurité intégrée de Windows

  • Dans toute chaîne de connexion pour SQL Server, incluez l'attribut Trusted_Connection=Yes et supprimez les attributs de nom d'utilisateur et de mot de passe.

    L'exemple suivant montre une chaîne de connexion type configurée pour la sécurité intégrée de Windows :

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

Configurez SQL Server pour reconnaître les utilisateurs qui y accéderont.

Pour configurer SQL Server pour la sécurité intégrée de Windows

  1. Dans le menu Démarrer de Windows, sélectionnez Microsoft SQL Server, puis Enterprise Manager.

  2. Ouvrez le nœud du serveur, puis développez celui de la base de données pour laquelle vous souhaitez attribuer des autorisations aux utilisateurs.

  3. Cliquez avec le bouton droit sur le nœud Utilisateurs, puis sélectionnez Nouvel utilisateur de base de données.

  4. Dans la boîte de dialogue Propriétés d'utilisateur de base de données, entrez domaine\nomutilisateur dans la zone Nom d'accès, puis cliquez sur OK. Vous pouvez également configurer SQL Server pour autoriser tous les utilisateurs du domaine à accéder à la base de données.

Voir aussi

Concepts

Emprunt d'identité ASP.NET

Accès à SQL Server à partir d'une application Web

Autres ressources

Sécurisation de sites Web ASP.NET