Azure SQL Database «Échec de la connexion pour l'utilisateur» dans l'application, mais fonctionne correctement dans SSMS

14

Je voulais essayer la fonctionnalité des utilisateurs 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:

entrez la description de l'image ici

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 j'obtiens est le suivant:

Err 18456, niveau 14, état 1, Sever SQL Azure, échec de la connexion de la ligne 1 pour l'utilisateur 'classifier'

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?

Ben Collins
la source

Réponses:

15

Nous avons constaté qu'avec les bases de données contenues / les utilisateurs contenus, vous devez spécifier:

GRANT CONNECT TO [YOUR_USER]

Sinon CONNECTsemble être révoqué par défaut. Une fois la modification ci-dessus effectuée, nous pourrions accéder à la base de données.

HowardvanRooijen
la source
Nous avions un compte existant qui fonctionnait, puis nous avons cessé de fonctionner. J'ai dû lui accorder à nouveau la connexion.
Shane Courtrille
Sur Azure, je reçois une erreur Cannot find the user 'myuser', because it does not exist or you do not have permission.bien que le nom d'utilisateur existe sous Sécurité> Connexions mais pas MyDatabse> Sécurité> Utilisateurs. J'ai essayé CREATE USER [myuser] FOR LOGIN [myuser] WITH DEFAULT_SCHEMA=[mydb] GOmais j'ai eu une erreurThe login already has an account under a different user name.
Korayem
J'avais un problème similaire. Dans un environnement de développement, tout fonctionne en se connectant à SQL Azure, mais une fois publié, il renvoie cette erreur. Cependant, je ne peux pas exécuter la commande ou créer l'utilisateur, quelqu'un essaie-t-il quelque chose de différent?
Ricker Silva
@dezso, je suis confronté à un problème similaire. Mon code ADO.NET et EF (DBContext) fonctionne correctement sur la machine locale (je n'ai pas essayé dans Azure) Mais le code EF implémenté à l'aide d'IdentityDBConext échoue. Je ne sais pas ce qui ne va pas ou quelles fonctionnalités d'IdentityDBConext nécessitent un accès au serveur. Voici ma question originale stackoverflow.com/questions/40260720/…
Hiren Desai
5

Lors du changement de notre API pour se connecter à une base de données Azure via un nouvel utilisateur contenu, nous avons dû changer 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 essayer de cette question .

sfm
la source
2

Mon problème était différent, mais lié: j'essayais de me connecter à une base de données Azure SQL en utilisant SQL Server Management Studio (SSMS) avec un utilisateur confiné . 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 "Se connecter à la base de données" sur le nom de la base de données à laquelle j'essayais de me connecter.

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.

Vince Horst
la source
Voulez-vous expliquer le vote négatif?
Vince Horst
1
Ce n'était pas moi, mais probablement parce que votre réponse est un peu à l'opposé de la question. Toujours utile cependant, et grâce à la mauvaise conception de cette boîte de dialogue SSMS, une erreur facile à faire!
Simon_Weaver
0

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 la Scaffold-DbContextcommande

https://github.com/aspnet/EntityFrameworkCore/issues/6624

Simon_Weaver
la source