Modification des mots de passe par programme
Avant SQL Server 2005, lorsque le mot de passe d'un utilisateur expirait, seul un administrateur pouvait le réinitialiser. Dans SQL Server 2005, SQL Server Native Client prend en charge l'expiration du mot de passe par programme, via le fournisseur OLE DB SQL Server Native Client et le pilote ODBC SQL Server Native Client, et via les modifications des boîtes de dialogue Connexion SQL Server.
[!REMARQUE]
Si possible, demandez aux utilisateurs de saisir leurs informations d'identification au moment de l'exécution et éviter de les stocker leurs références dans un format permanent. Si vous devez rendre les informations d'identification permanentes, chiffrez-les avec l'API de chiffrement Win32. Pour plus d'informations sur l'utilisation des mots de passe, consultez Mots de passe forts.
Codes d'erreur des connexions SQL Server
Lorsqu'une connexion ne peut pas être établie en raison de problèmes d'authentification, l'un des codes d'erreur SQL Server suivants est disponible pour aider l'application à établir le diagnostic et la récupération.
Code d'erreur SQL Server |
Message d'erreur |
---|---|
15113 |
La connexion a échoué pour l'utilisateur '%.*ls' Motif : échec de la validation du mot de passe. Le compte est verrouillé. |
18463 |
Échec de la connexion pour l'utilisateur '%.*ls'. Raison : échec de changement de mot de passe. Impossible d'utiliser le mot de passe pour l'instant. |
18464 |
Échec de la connexion pour l'utilisateur '%.*ls'. Raison : échec de changement de mot de passe. Ce mot de passe ne répond pas aux exigences de la stratégie, car il est trop court. |
18465 |
Échec de la connexion pour l'utilisateur '%.*ls'. Raison : échec de changement de mot de passe. Ce mot de passe ne répond pas aux exigences de la stratégie, car il est trop long. |
18466 |
Échec de la connexion pour l'utilisateur '%.*ls'. Raison : échec de changement de mot de passe. Ce mot de passe ne répond pas aux exigences de la stratégie, car il n'est pas assez complexe. |
18467 |
Échec de la connexion pour l'utilisateur '%.*ls'. Raison : échec de changement de mot de passe. Le mot de passe ne répond pas aux exigences de la DLL de filtre de mots de passe. |
18468 |
Échec de la connexion pour l'utilisateur '%.*ls'. Raison : échec de changement de mot de passe. Une erreur inattendue s'est produite lors de la validation de mot de passe. |
18487 |
Échec de la connexion pour l'utilisateur '%.*ls'. Raison : le mot de passe associé à ce compte a expiré. |
18488 |
Échec de l'ouverture de session pour l'utilisateur '%.*ls'. Raison : le mot de passe du compte doit être changé. |
Fournisseur OLE DB SQL Server Native Client
Le fournisseur OLE DB SQL Server Native Client prend en charge l'expiration de mot de passe via une interface utilisateur et par programme.
Expiration du mot de passe de l'interface utilisateur OLE DB
Le fournisseur OLE DB SQL Server Native Client prend en charge l'expiration de mot de passe à travers les modifications effectuées aux boîtes de dialogue Connexion SQL Server. Si la valeur de DBPROP_INIT_PROMPT est définie sur DBPROMPT_NOPROMPT, la tentative de connexion initiale échoue si le mot de passe a expiré.
Si DBPROP_INIT_PROMPT a été défini sur une autre valeur, l'utilisateur visualise la boîte de dialogue Connexion SQL Server, que le mot de passe ait expiré ou pas. L'utilisateur peut cliquer sur le bouton Options et activer Changer le mot de passe pour modifier le mot de passe.
Si l'utilisateur clique sur OK et que le mot de passe a expiré, SQL Server invite l'utilisateur à entrer et à confirmer un nouveau mot de passe à l'aide de la boîte de dialogue Changement de mot de passe SQL Server.
Comportement d'invite OLE DB et comptes verrouillés
Les tentatives de connexion peuvent échouer en raison du compte verrouillé. Si cela se produit après l'affichage de la boîte de dialogue Connexion SQL Server, le message d'erreur du serveur s'affiche à l'utilisateur et la tentative de connexion est abandonnée. Cette situation peut aussi avoir lieu après l'affichage de la boîte de dialogue Changement de mot de passe SQL Server si l'utilisateur entre une mauvaise valeur pour l'ancien mot de passe. Dans ce cas le même message d'erreur s'affiche et la tentative de connexion est abandonnée.
Regroupement de connexions OLE DB, expiration de mot de passe et comptes verrouillés
Un compte peut être verrouillé ou son mot de passe peut expirer pendant que la connexion est toujours active dans un pool de connexions. Le serveur contrôle les mots de passe périmés et les comptes verrouillés en deux occasions. La première occasion correspond au moment de la création de la connexion. La seconde occasion se produit lors de la réinitialisation de la connexion, quand la connexion est extraite du pool.
Quand la tentative de réinitialisation échoue, la connexion est supprimée du pool et une erreur est retournée.
Expiration de mot de passe par programmation OLE DB
Le fournisseur OLE DB SQL Server Native Client prend en charge l'expiration de mot de passe via la propriété SSPROP_AUTH_OLD_PASSWORD (type VT_BSTR) ajoutée au jeu de propriétés DBPROPSET_SQLSERVERDBINIT.
La propriété « Mot de passe » existante se rapporte à DBPROP_AUTH_PASSWORD et est utilisée pour stocker le nouveau mot de passe.
[!REMARQUE]
Dans la chaîne de connexion, la propriété « Ancien Mot de passe » définit SSPROP_AUTH_OLD_PASSWORD, qui correspond au mot de passe en cours (peut-être périmé) qui n'est pas disponible via une propriété de chaîne de fournisseur.
Le fournisseur ne rend pas la valeur de cette propriété persistante. Lorsque cette propriété est définie, le fournisseur n'utilise pas le pool de connexions de la première connexion, sinon une nouvelle connexion interviendra. Si la modification de mot de passe est réussie, la connexion actuelle ne peut pas être réutilisée, car elle contient toujours l'ancien mot de passe, qui ne sera pas valide après la modification. Également, si la connexion réussit, le fournisseur efface la propriété. Les tentatives suivantes d'extraction de l'ancien mot de passe retournent VT_EMPTY.
[!REMARQUE]
SSPROP_AUTH_OLD_PASSWORD ne doit jamais être rendu persistant, car il n'est utilisé que lorsqu'un mot de passe a expiré.
Notez que chaque fois que la propriété « Ancien Mot de passe » propriété est définie, le fournisseur suppose qu'une tentative de modification du mot de passe a lieu, à moins que l'authentification Windows ne soit également spécifiée, dans quel cas elle est toujours prioritaire.
Si l'authentification Windows est utilisée, la spécification de l'ancien mot de passe se traduit par DB_E_ERRORSOCCURRED ou DB_S_ERRORSOCCURRED, selon que l'ancien mot de passe a respectivement été spécifié comme REQUIRED ou OPTIONAL, et que la valeur d'état de DBPROPSTATUS_CONFLICTINGBADVALUE est retournée dans dwStatus. Ce cas est détecté lorsque IDBInitialize::Initialize est appelée.
Si une tentative de modifier le mot de passe échoue de façon inattendue, le serveur retourne le code d'erreur 18468. Une erreur OLEDB standard est retournée à partir de la tentative de connexion.
Pour plus d'informations sur le jeu de propriétés DBPROPSET_SQLSERVERDBINIT, consultez Propriétés d'initialisation et d'autorisation.
Pilote ODBC SQL Server Native Client
Le fournisseur OLE DB SQL Server Native Client prend en charge l'expiration de mot de passe via une interface utilisateur et par programme.
Expiration du mot de passe de l'interface utilisateur ODBC
Le pilote ODBC SQL Server Native Client prend en charge l'expiration de mot de passe à travers les modifications effectuées dans les boîtes de dialogue Connexion SQL Server.
Si SQLDriverConnect est appelé et que la valeur de DriverCompletion est SQL_DRIVER_NOPROMPT, la tentative de connexion initiale échoue si le mot de passe a expiré. La valeur SQLSTATE 28000 et la valeur du code d'erreur native 18487 sont retournées par les appels suivants de SQLError ou SQLGetDiagRec.
Si DriverCompletion a été défini sur une autre valeur, l'utilisateur visualise la boîte de dialogue Connexion SQL Server, que le mot de passe ait expiré ou pas. L'utilisateur peut cliquer sur le bouton Options et activer Changer le mot de passe pour modifier le mot de passe.
Si l'utilisateur clique sur OK et que le mot de passe a expiré, SQL Server invite l'utilisateur à entrer et à confirmer un nouveau mot de passe à l'aide de la boîte de dialogue Changement de mot de passe SQL Server.
Comportement d'invite ODBC et comptes verrouillés
Les tentatives de connexion peuvent échouer en raison du compte verrouillé. Si cela se produit après l'affichage de la boîte de dialogue Connexion SQL Server, le message d'erreur du serveur s'affiche à l'utilisateur et la tentative de connexion est abandonnée. Cette situation peut aussi avoir lieu après l'affichage de la boîte de dialogue Changement de mot de passe SQL Server si l'utilisateur entre une mauvaise valeur pour l'ancien mot de passe. Dans ce cas le même message d'erreur s'affiche et la tentative de connexion est abandonnée.
Regroupement de connexions ODBC, expiration de mot de passe et comptes verrouillés
Un compte peut être verrouillé ou son mot de passe peut expirer pendant que la connexion est toujours active dans un pool de connexions. Le serveur contrôle les mots de passe périmés et les comptes verrouillés en deux occasions. La première occasion correspond au moment de la création de la connexion. La seconde occasion se produit lors de la réinitialisation de la connexion, quand la connexion est extraite du pool.
Quand la tentative de réinitialisation échoue, la connexion est supprimée du pool et une erreur est retournée.
Expiration de mot de passe par programmation ODBC
Le pilote ODBC SQL Server Native Client prend en charge l'expiration de mot de passe via l'ajout de l'attribut SQL_COPT_SS_OLDPWD défini avant de se connecter au serveur à l'aide de la fonction SQLSetConnectAttr.
L'attribut SQL_COPT_SS_OLDPWD du handle de connexion fait référence au mot de passe périmé. Il n'existe aucun attribut de chaîne de connexion pour cet attribut, car il entraînerait une interférence avec le regroupement de connexions. Si la connexion réussit, le pilote efface cet attribut.
Pour cette fonctionnalité, le pilote ODBC SQL Server Native Client retourne SQL_ERROR dans quatre cas : expiration de mot de passe, conflit de stratégie de mot de passe, verrouillage de compte et définition de la propriété d'ancien mot de passe en même temps que l'utilisation de l'authentification Windows. Le pilote retourne les messages d'erreur appropriés à l'utilisateur lors de l'appel de SQLGetDiagField.