Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Une chaîne de connexion Microsoft.Data.SqlClient est une liste de paires keyword=value séparées par des points-virgules. Passez-le à SqlConnection ou SqlConnectionStringBuilder:
Server=tcp:sql.example.com,1433;Database=Orders;Integrated Security=true;Encrypt=Strict
Une chaîne de connexion répond à quatre questions :
- Quel serveur et quelle base de données l’application utilise-t-elle ?
- Sous quelle identité l’application s’exécute-t-elle ?
- Comment le client valide-t-il le certificat serveur ?
- De quel comportement de connexion la charge de travail a-t-elle besoin ?
Cet article traite de ces choix et des règles que le pilote utilise pour lire le texte. Pour chaque mot-clé, ses synonymes et ses valeurs par défaut, voir Options de connexion. Pour créer et modifier des chaînes de connexion dans le code, voir Constructeurs de chaînes de connexion.
Choisir un motif d’authentification
Utilisez le schéma qui correspond au déploiement. Remplacez chaque placeholder, comme <server>, par votre valeur.
| Environnement | Modèle | Chaîne de connexion |
|---|---|---|
| SQL Server sur Windows avec un identité Windows de domaine ou local | Authentification intégrée Windows | Server=<server>;Database=<database>;Integrated Security=true;Encrypt=true |
| Application hébergée dans Azure et connectée à Azure SQL | Identité managée Microsoft Entra ID | Server=tcp:<server>.database.windows.net,1433;Database=<database>;Authentication=Active Directory Managed Identity;Encrypt=Strict |
| Developer workstation se connectant à Azure SQL | Chaîne d’identifiants par défaut Microsoft Entra ID | Server=tcp:<server>.database.windows.net,1433;Database=<database>;Authentication=Active Directory Default;Encrypt=Strict |
| Station de travail développeur se connectant à une base de données SQL dans Microsoft Fabric | Chaîne d’identifiants par défaut Microsoft Entra ID | Server=tcp:<server>,1433;Database=<database>;Authentication=Active Directory Default;Encrypt=Strict |
| Outil de bureau interactif se connectant à Azure SQL | Authentification interactive de Microsoft Entra ID | Server=tcp:<server>.database.windows.net,1433;Database=<database>;Authentication=Active Directory Interactive;Encrypt=Strict |
| Environnement nécessitant une authentification SQL | Nom d’utilisateur et mot de passe depuis un magasin secret | Server=<server>;Database=<database>;User ID=<user>;Password=<password>;Encrypt=true |
L’authentification intégrée Windows se connecte sous l’identité du processus. Pour une application de bureau ou de console, c’est généralement l’utilisateur connecté. Pour une application web ou un service Windows, c'est le pool d'applications ou le compte de service. L’emprunt d’identité peut changer l’identité. Accordez un identifiant de connexion et des permissions de base de données à l’identité que votre application utilise réellement.
Ces trois formes d’authentification intégrée Windows sont équivalentes :
Server=sql.example.com;Database=Orders;Integrated Security=true;Encrypt=true
Server=sql.example.com;Database=Orders;Integrated Security=SSPI;Encrypt=true
Server=sql.example.com;Database=Orders;Trusted_Connection=yes;Encrypt=true
Si une chaîne définit Integrated Security=true et définit également User ID et Password, le pilote utilise l’authentification Windows et ignore le nom d’utilisateur et le mot de passe.
Microsoft. Data.SqlClient 7.0 et versions ultérieures nécessitent le package apparié Microsoft.Data.SqlClient.Extensions.Azure par version pour les méthodes d’authentification Microsoft Entra ID fournies par le pilote. Vous n’avez pas besoin de ce package lorsque le code applicatif fournit un jeton d’accès ou un callback de jeton d’accès.
Pour les valeurs acceptées Authentication , voir Options d’authentification. L’authentification nécessite également des utilisateurs de base de données, des permissions et une configuration d’identité sur le serveur. Pour les étapes de configuration, voir authentification Microsoft Entra ID et authentification SQL Server.
Spécifier le serveur et la base de données
Server et Database sont les noms de mots-clés les plus lisibles. Le générateur les écrit comme leurs équivalents canoniques, Data Source et Initial Catalog. Les quatre noms fonctionnent dans une chaîne de connexion.
Réglez Server sur l’une de ces formes :
| Formulaire | Example | Utiliser |
|---|---|---|
| Nom de l’hôte | Server=sql.example.com |
L’instance par défaut sur le port 1433. |
| Nom hôte et port | Server=tcp:sql.example.com,1433 |
Un port TCP spécifique. Séparez le port par une virgule et non par deux-points. |
| Instance nommée | Server=sql.example.com\SALES |
Une instance nommée. Le pilote demande au service SQL Server Browser le port sur le port UDP 1434. |
| Serveur local |
Server=(local) ou Server=. |
L’instance par défaut sur l’ordinateur local. |
| LocalDB | Server=(localdb)\MSSQLLocalDB |
SQL Server Express LocalDB sur Windows. La connexion n’est pas chiffrée, même avec Encrypt=Mandatory, et Encrypt=Strict échoue. |
| Canal nommé | Server=np:\\sql.example.com\pipe\sql\query |
Une connexion à un tube nommé sous Windows. |
Utilisez tcp:, un nom hôte pleinement qualifié, et un port explicite en production. Utilisez un nom DNS correspondant au certificat serveur, et non une adresse IP, car la validation du certificat compare le nom du serveur dans la chaîne de connexion avec les noms du certificat.
Lorsque vous vous connectez à Azure SQL Database avec une authentification SQL et un nom d’utilisateur sous la forme user@servername, la partie servername doit correspondre au serveur dans Server.
Pour un écouteur de groupe de disponibilité ou une instance de cluster de basculement, consultez également Multi Subnet Failover dans Options de connexion.
Configurer le chiffrement et la validation des certificats
Le Encrypt mot-clé accepte les valeurs suivantes, quelle que soit la casse :
| Value | Valeur du Builder | Signification |
|---|---|---|
Strict |
Strict |
Utilise TDS 8.0. Chiffre la connexion avant l’ouverture de session et valide toujours le certificat serveur. |
Mandatory, true, yes |
True |
Chiffre la connexion. Cette valeur est la valeur par défaut. |
Optional, false, no |
False |
Chiffre toute la connexion uniquement lorsque le serveur nécessite un chiffrement. Lorsque le serveur prend en charge le chiffrement mais ne l’exige pas, il chiffre seulement le paquet de connexion. |
Utilisez Strict lorsque le serveur supporte TDS 8.0 et possède un certificat que le client peut valider. Azure SQL Database et SQL Database dans Microsoft Fabric le supportent. Une connexion LocalDB n’est pas chiffrée, même avec Mandatory, et Strict échoue.
Les valeurs Encrypt et Trust Server Certificate se combinent comme suit :
| Chiffrer | Certificat de serveur de confiance | Result |
|---|---|---|
Optional |
false |
Lorsque le serveur nécessite un chiffrement, toute la connexion est chiffrée, et le certificat du serveur doit être validé. Sinon, la connexion échoue. Lorsque le serveur supporte le chiffrement mais ne l’exige pas, seul le paquet de connexion est chiffré, et le pilote ne valide pas le certificat serveur à moins que la connexion n’utilise AccessToken ou AccessTokenCallback. Lorsque le serveur ne prend pas en charge le chiffrement, rien n’est chiffré. |
Optional |
true |
Lorsque le serveur nécessite un chiffrement, toute la connexion est chiffrée. Lorsque le serveur supporte le chiffrement mais ne l’exige pas, seul le paquet de connexion est chiffré. Le pilote de périphérique ne valide pas le certificat du serveur. |
Mandatory |
false |
Le chiffrement ne se produit que lorsque le certificat du serveur est valide. Sinon, la connexion échoue. |
Mandatory |
true |
Le chiffrement existe toujours, mais le pilote ne valide pas le certificat serveur. |
Strict |
Ignoré | Le chiffrement a toujours lieu et le certificat serveur doit être validé. Sinon, la connexion échoue. |
Ne réglez Trust Server Certificate=true pas la correction d’une erreur de connexion en production. Il chiffre le canal mais ne confirme pas l’identité du serveur. Limitez-le aux environnements de développement où un certificat de confiance n’est pas disponible.
Lorsque le nom du serveur ne Data Source correspond pas au certificat, définissez Host Name In Certificate le nom dans le certificat. SqlClient ne le vérifie que lorsque le nom du serveur ne correspond pas, et il n’épingle pas de certificat. Pour accepter un seul certificat spécifique, réglez Server Certificate sur le chemin d’un fichier PEM, DER ou CER :
Server=tcp:sql.example.com,1433;Encrypt=Strict;Host Name In Certificate=sqlhost.example.com
Server=tcp:sql.example.com,1433;Encrypt=Strict;Server Certificate=C:\certificates\server.cer
Pour les règles complètes de validation, voir Chiffrement et validation des certificats.
Utiliser le regroupement de connexions
Le pooling est activé par défaut. Lorsque vous ouvrez un SqlConnection, le conducteur prend une connexion physique d’un pool qui correspond à la connexion. Lorsque vous fermez ou jetez la connexion, la connexion physique revient dans le pool au lieu de se fermer. L’ouverture d’un pool évite la connexion réseau, la poignée de main TLS et l’authentification.
Suivez ces règles :
Ouvrez une connexion juste avant d’en avoir besoin, et libérez-la dès que vous avez terminé, avec
usingouawait using. Une connexion qui n’est pas éliminée reste vérifiée, et la piscine peut s’épuiser.Construis la chaîne de connexion une fois au démarrage et réutilise-la. La clé du pool inclut le texte exact de la chaîne de connexion, donc un ordre différent de mot-clé, un synonyme, ou une valeur par requête comme un identifiant de requête ou un nom d’utilisateur crée un pool séparé. Le constructeur écrit une forme canonique. Pour plus d’informations, voir Conserver une chaîne de connexion canonique.
Attendez-vous à un pool séparé pour chaque identité Windows sous authentification intégrée, chaque SqlCredential instance et chaque AccessToken valeur. Utilisez une méthode fournie
Authenticationpar le pilote ou une méthode réutilisée AccessTokenCallback au lieu de définirAccessTokenpour chaque connexion.Cherchez les connexions qui ne sont pas éliminées avant de relever
Max Pool Size, ce qui est par défaut à 100. Lorsque chaque connexion d’un pool est utilisée,Openattend jusqu’àConnect Timeoutpuis lance InvalidOperationException:Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.Planification de la capacité des serveurs pour chaque pool. Chaque processus, ou chaque domaine d’application sur .NET Framework, possède ses propres pools. Les connexions au serveur peuvent atteindre
Max Pool Size, multiplié par les pools de chaque processus et par le nombre d’instances d’application.Ne définissez pas
Pooling=falsepour contourner un problème de pooling. À chaque ouverture, une connexion complète est alors effectuée.
Pour fermer les connexions pooled qui restent inactives trop longtemps, voir Limiter le temps d’inactivité des connexions. Pour les clés de pool, le dimensionnement, la réinitialisation et les transactions, voir le pooling de connexions SQL Server.
Paramètres de connexion et de commande séparés
Une chaîne de connexion contrôle l’établissement de la connexion et le comportement de la session. Une commande contrôle une opération SQL.
| Requirement | Configurer sur |
|---|---|
| Temps accordé pour établir une connexion ou en obtenir une dans la piscine |
Connect Timeout mot-clé |
| Délai d’attente par défaut pour les commandes sur la connexion |
Command Timeout mot-clé |
| Délai d’expiration d’une commande | CommandTimeout |
| Annulation par l’appelant |
CancellationToken Transmis aux méthodes asynchrones |
| Politique de réessai pour ouvrir une connexion ou exécuter une commande |
Logique de réessai configurable sur SqlConnection ou SqlCommand |
Un temps d’attente plus long ne constitue pas une logique de nouvelle tentative. Un délai d’expiration limite une seule attente. Un réessai déclenche une autre tentative, et il doit être limité et sans risque d’être répété.
Déclarez l’identité de l’application
Application Name définit le nom que le serveur rapporte via APP_NAME(). Utilisez un nom stable pour chaque charge de travail déployée. Les frameworks et outils qui ouvrent des connexions pour une application peuvent également se déclarer via la propriété RegisteredApplication, qui n’a pas de mot-clé de chaîne de connexion. Pour plus d’informations, voir Signaler l’identité de l’application.
Construire des chaînes de connexion en toute sécurité
À utiliser SqlConnectionStringBuilder lorsque le code ajoute ou modifie une valeur. Ne rattachez pas de texte non fiable à une chaîne de connexion, car un point-virgule dans ce texte peut ajouter ou remplacer un mot-clé. Le constructeur valide les valeurs, associe les synonymes à des mots-clés canoniques, et met chaque valeur entre guillemets pour que la valeur ne puisse pas ajouter de mots-clés. Pour des exemples, voir Constructeurs de chaînes de connexion.
Stocker les informations de connexion en dehors du code
Chargez les chaînes de connexion depuis le système de configuration de l’application. Les applications .NET utilisent couramment des variables d’environnement, des secrets utilisateur pour le développement local, Azure App Configuration et Azure Key Vault.
Suivez ces règles :
- Ne validez pas dans le contrôle de code source les mots de passe, les clés secrètes client, les jetons d’accès ou les chaînes de connexion de production.
- Préférez une méthode d'authentification qui n'a pas besoin de mot de passe dans la chaîne de connexion.
- Restreignez l’accès à la source de configuration.
- Effectuez la rotation des secrets stockés, puis redémarrez ou rafraîchissez les applications qui les mettent en cache.
- N’écrivez pas de chaînes de connexion dans les logs, exceptions, traces ou télémétrie.
- Laissez
Persist Security Info=false, la valeur par défaut, pour qu’une connexion ouverte n’expose pas le mot de passe via sa propriétéConnectionString.
Pour les fournisseurs de configuration .NET, voir Configuration en .NET. Pour plus d’options, voir Protéger les informations de connexion.
Règles d’analyse
Le conducteur applique ces règles :
- Les mots-clés ne sont pas sensibles à la casse.
DATABASE,Database, etdatabasesont le même terme de recherche. - Beaucoup de mots-clés ont des synonymes.
ServeretData Sourcefixent la même valeur. L’article Connection options liste les synonymes pour chaque mot-clé. - Lorsqu’un mot-clé apparaît plusieurs fois, la dernière valeur l’emporte. Les synonymes comptent comme le même mot-clé.
- Le pilote ignore les espaces autour des mots-clés et autour des valeurs sans guillemets.
- Un point-virgule à la fin est optionnel.
- Un mot-clé que le pilote ne reconnaît pas génère ArgumentException avec le message
Keyword not supported.
Les valeurs peuvent être sensibles à la majuscule, selon le mot-clé. Un mot de passe est sensible à la casse.
Encrypt=STRICT et Encrypt=strict sont les mêmes.
Ce programme montre comment le builder normalise les mots-clés, résout un doublon et met entre guillemets les caractères spéciaux. L’onglet .NET Framework utilise C# 7.3. Pour créer un projet qui exécute les exemples, voir Créer le projet.
using Microsoft.Data.SqlClient;
// Synonyms and keyword case are normalized to canonical keywords.
var parsed = new SqlConnectionStringBuilder(
"server=tcp:sql.example.com,1433;DATABASE=Orders;uid=app_user;encrypt=yes;timeout=30");
Console.WriteLine(parsed.ConnectionString);
// When a keyword repeats, the last value wins.
var duplicate = new SqlConnectionStringBuilder(
"Server=sql.example.com;Database=Orders;Database=Archive");
Console.WriteLine($"InitialCatalog: {duplicate.InitialCatalog}");
// The builder quotes values that contain delimiters.
var quoted = new SqlConnectionStringBuilder
{
DataSource = "sql.example.com",
UserID = "app_user",
Password = "a;b'c\"d",
};
Console.WriteLine(quoted.ConnectionString);
Console.WriteLine($"Round trip: {new SqlConnectionStringBuilder(quoted.ConnectionString).Password == quoted.Password}");
La sortie est la suivante :
Data Source=tcp:sql.example.com,1433;Initial Catalog=Orders;User ID=app_user;Connect Timeout=30;Encrypt=True
InitialCatalog: Archive
Data Source=sql.example.com;User ID=app_user;Password="a;b'c""d"
Round trip: True
La première ligne montre chaque synonyme remplacé par son mot-clé canonique : server par Data Source, DATABASE par Initial Catalog, uid par User ID, et timeout par Connect Timeout.
Valeurs du devis
Entourer une valeur entre guillemets doubles (") ou guillemets simples (') lorsqu’elle contient un point-virgule, commence ou se termine par un espace, ou commence ou se termine par un guillemet. Dans une valeur citée, écrivez deux fois le guillemet fermant.
| Value | Formulaire de chaîne de connexion |
|---|---|
a;b |
Password="a;b" |
abc' |
Password="abc'" |
say "hi" |
Password='say "hi"' |
a;b'c"d |
Password="a;b'c""d" |
Les règles de guillemets sont faciles à mal appliquer. Fixez les valeurs via les propriétés SqlConnectionStringBuilder et laissez le constructeur les mettre entre guillemets. Pour plus d’informations, voir Construire des chaînes de connexion en toute sécurité.
Spécifier les valeurs booléennes
Les mots-clés qui prennent une valeur booléenne acceptent true, false, yes et no, quelle que soit la casse.
Integrated Security accepte sspiaussi , ce qui signifie true. Le constructeur écrit True ou False.
Utilisez des mots-clés provenant d’autres pilotes
Microsoft. Data.SqlClient n'accepte pas les mots-clés ODBC ou OLE DB tels que Driver et Provider. Supprimez ces mots-clés lorsque vous déplacez une chaîne de connexion d’un autre pilote.
System.Data.SqlClientLes chaînes de connexion fonctionnent dans Microsoft. Data.SqlClient, avec ces différences :
-
Encryptprend par défaut la valeurMandatorydans Microsoft.Data.SqlClient. Un serveur sans certificat fiable échoue à valider le certificat. Installez un certificat de confiance sur le serveur. - Sur .NET,
Network Library,Connection Reset, etTransparent Network IP Resolutionne sont pas pris en charge. Supprimez-les. -
Context Connection=truen’est pas pris en charge. -
Asynchronous Processingn’est pas un mot-clé pris en charge et génèreArgumentException. Supprimez-le. Les méthodes asynchrones n’en ont pas besoin. -
Type System Version=SQL Server 2000n’est pas pris en charge. Créer la connexion génèreArgumentException. UtiliserLatest,SQL Server 2012,SQL Server 2008, ouSQL Server 2005.
Contenu connexe
- Utilisez Microsoft. Data.SqlClient dans une application .NET
- Options de connexion
- Générateurs de chaînes de connexion
- Se connecter à une source de données
- Pooling de connexions SQL Server
- Authentification avec Microsoft Entra ID
- Chiffrement et validation de certificat
- Instances d’utilisateur SQL Server Express
- Cycle de vie de prise en charge du pilote SqlClient