Je voulais essayer la fonctionnalité tilisateurs de base de données contenus sur Azure SQL Database V12, mais j'ai un problème d'authentification qui me semble étrange.
J'ai créé une base de données appelée Classifier
. J'ai ajouté mon adresse IP aux règles de pare-feu afin de pouvoir me connecter au serveur Azure db à partir de SSMS sur mon poste de travail. Une fois que j'ai pu me connecter via SSMS pour l'administration, j'ai essayé d'ajouter un utilisateur avec un mot de passe à la base de données, comme ceci:
CREATE USER classifier WITH PASSWORD='thepassword'
J'ai également ajouté cet utilisateur aux rôles de rédacteur et de lecteur de données:
exec sp_addrolemember 'db_datawriter', 'classifier'
exec sp_addrolemember 'db_datareader', 'classifier'
Après cela, je peux me connecter à la base de données avec ces informations d'identification de SSMS:
Mais c'est là que les choses tournent mal: j'ai essayé plusieurs incantations de chaînes de connexion différentes et je n'arrive pas à me connecter dans une application Web sur laquelle je travaille. Cela ne fonctionnait pas dans l'environnement Azure, je suis donc en cours d'exécution sur localhost avec une chaîne de connexion à la base de données Azure, et il ne se connecte tout simplement pas. Voici la chaîne de connexion que j'utilise en ce moment:
<add name="Classifier" connectionString="Data Source=xxxxxxx.database.secure.windows.net;Initial Catalog=Classifier;User ID=classifier;Password=xxxxxxxxxxxxx;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName="System.Data.SqlClient"/>
J'ai essayé de réinitialiser le mot de passe (via SSMS) pour l'utilisateur, puis de mettre à jour la chaîne de connexion; J'ai également revérifié le mot de passe en le copiant directement à partir de cette chaîne de connexion et dans la boîte de dialogue de connexion dans SSMS pour m'assurer que je n'avais pas de faute de frappe.
J'ai activé l'audit sur le serveur Azure db en espérant obtenir des détails sur les raisons de l'échec, mais tout ce que je reçois est le suivant:
Et c'est là que je suis coincé. La plupart de ce que j'ai pu trouver par le biais de documentation ou de blogs indique que la chose à faire est de regarder les journaux de SQL Server pour voir quel est le véritable état d'erreur, ce qui indiquerait plus précisément la nature de l'échec, mais puisque je 'ai affaire à Azure, il n'y a aucun moyen de le faire (pour autant que je sache).
Qu'est-ce qui pourrait entraîner l'échec de l'application là où SSMS (et LinqPad et Visual Studio Server Explorer, soit dit en passant) réussit?
Nous avons constaté qu'avec les bases de données/les utilisateurs contenus, vous devez spécifier:
GRANT CONNECT TO [YOUR_USER]
Sinon, CONNECT
semble être révoqué par défaut. Une fois la modification ci-dessus effectuée, nous pourrions accéder à la base de données.
Lors du changement de notre API pour se connecter à une base de données Azure via un nouvel utilisateur contenu, nous avons dû modifier notre chaîne de connexion pour inclure:
Persist Security Info=True;
Bien que je ne comprenne pas pourquoi ce changement était nécessaire, je voulais publier ici au cas où cela aiderait quelqu'un d'autre à l'avenir.
Nous sommes venus à l'origine pour essayer cela depuis cette question .
Mon problème était différent, mais lié: j'essayais de me connecter à une base de données SQL Azure à l'aide de SQL Server Management Studio (SSMS) avec un tilisateur conten . J'obtenais un message "Échec de la connexion pour l'utilisateur" dans SSMS.
Solution: dans les options de connexion SSMS pour la fenêtre de requête, j'avais défini "Connect to Database" sur le nom de la base de données à laquelle j'essayais de relier.
Explication: Rétrospectivement, la raison était évidente: les utilisateurs confinés ne sont autorisés qu'à se connecter aux bases de données dans lesquelles ils ont été créés.
Cela peut se produire si vous exécutez une commande Powershell contenant une chaîne de connexion lorsque votre mot de passe contient $
. Vous pouvez contourner cela en joignant la chaîne de connexion entre guillemets simples - ou en ne stockant pas votre mot de passe dans la chaîne de connexion en premier lieu ;-)
Par exemple. J'ai rencontré ça avec Scaffold-DbContext
commande