Baza danych Azure SQL „Logowanie nie powiodło się dla użytkownika” w aplikacji, ale działa dobrze w SSMS

14

Chciałem wypróbować funkcję użytkowników bazy danych zawartej w bazie danych Azure SQL Database 12, ale mam problem z uwierzytelnieniem, który wydaje mi się dziwny.

Utworzyłem bazę danych o nazwie Classifier. Dodałem mój adres IP do reguł zapory, aby móc połączyć się z serwerem db Azure z SSMS na mojej stacji roboczej. Gdy udało mi się połączyć za pośrednictwem SSMS w celu administrowania, próbowałem dodać użytkownika z hasłem do bazy danych:

CREATE USER classifier WITH PASSWORD='thepassword'

Dodałem także tego użytkownika do ról pisarza i czytelnika:

exec sp_addrolemember 'db_datawriter', 'classifier'
exec sp_addrolemember 'db_datareader', 'classifier'

Po tym jestem w stanie połączyć się z bazą danych przy użyciu tych poświadczeń z SSMS:

wprowadź opis zdjęcia tutaj

Ale tutaj wszystko idzie nie tak: wypróbowałem kilka różnych inkantacji ciągu połączenia i nie mogę się połączyć w aplikacji internetowej, nad którą pracuję. Nie działało w środowisku Azure, więc działam na localhost z parametrem połączenia z bazą danych Azure i po prostu się nie łączy. Oto ciąg połączenia, którego obecnie używam:

<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"/>

Próbowałem zresetować hasło użytkownika (przez SSMS), a następnie zaktualizować parametry połączenia; Sprawdziłem również dwukrotnie hasło, kopiując je bezpośrednio z tego ciągu połączenia i do okna dialogowego połączenia w SSMS, aby upewnić się, że nie mam tam literówki.

Włączyłem inspekcję na serwerze db Azure, mając nadzieję uzyskać szczegółowe informacje na temat przyczyny niepowodzenia, ale otrzymuję tylko:

Błąd 18456, poziom 14, stan 1, serwer Sever SQL Azure, wiersz 1 Logowanie nie powiodło się dla użytkownika „klasyfikatora”

I tu utknąłem. Większość tego, co udało mi się znaleźć za pomocą dokumentacji lub blogów, wskazuje, że należy spojrzeć na dzienniki programu SQL Server, aby zobaczyć, jaki jest rzeczywisty stan błędu, który wskazywałby węższy charakter awarii, ale ponieważ Mam do czynienia z platformą Azure, nie ma na to sposobu (o ile wiem).

Co może spowodować awarię aplikacji w przypadku powodzenia SSMS (i, nawiasem mówiąc, LinqPad i Visual Studio Server Explorer)?

Ben Collins
źródło

Odpowiedzi:

15

Stwierdziliśmy, że w przypadku zawartych baz danych / ograniczonych użytkowników należy określić:

GRANT CONNECT TO [YOUR_USER]

W przeciwnym razie CONNECTwydaje się, że jest domyślnie odwołany. Po wprowadzeniu powyższej zmiany możemy uzyskać dostęp do bazy danych.

HowardvanRooijen
źródło
Mieliśmy istniejące konto, które działało, a następnie przestało działać. Musiałem przyznać połączenie ponownie.
Shane Courtrille
Na Cannot find the user 'myuser', because it does not exist or you do not have permission.platformie Azure pojawia się błąd, mimo że nazwa użytkownika istnieje w obszarze Zabezpieczenia> Loginy, ale nie MyDatabse> Zabezpieczenia> Użytkownicy. Próbowałem, CREATE USER [myuser] FOR LOGIN [myuser] WITH DEFAULT_SCHEMA=[mydb] GOale dostałem błądThe login already has an account under a different user name.
Korayem
Miałem podobny problem. W środowisku deweloperskim wszystko działa, łącząc się z SQL Azure SQL Server, ale po opublikowaniu zgłasza ten błąd. Jednak nie mogę uruchomić polecenia ani utworzyć użytkownika, ktoś próbuje czegoś innego?
Ricker Silva
@dezso Mam do czynienia z podobnym problemem. Mój kod ADO.NET i EF (DBContext) działa dobrze na komputerze lokalnym (nie próbowałem na platformie Azure), ale kod EF zaimplementowany przy użyciu IdentityDBConext kończy się niepowodzeniem. Nie jestem pewien, co jest nie tak lub jakie funkcje IdentityDBConext wymagają dostępu do serwera. Oto moje oryginalne pytanie stackoverflow.com/questions/40260720/…
Hiren Desai
5

Podczas przełączania naszego interfejsu API w celu łączenia się z bazą danych Azure za pośrednictwem nowego zawartego użytkownika musieliśmy zmienić parametry połączenia, aby uwzględnić:

Persist Security Info=True;

Chociaż nie rozumiem, dlaczego ta zmiana była wymagana, chciałem opublikować tutaj, aby pomóc komuś innemu w przyszłości.

Pierwotnie przyszliśmy spróbować tego z tego pytania .

sfm
źródło
2

Mój problem był inny, ale związany: próbowałem połączyć się z bazą danych Azure SQL przy użyciu programu SQL Server Management Studio (SSMS) z zawartym użytkownikiem . Otrzymałem komunikat „Logowanie nie powiodło się dla użytkownika” w SSMS.

Rozwiązanie: w opcjach połączenia SSMS dla okna zapytania ustawiłem „Połącz z bazą danych” na nazwę bazy danych, z którą próbowałem się połączyć.

Objaśnienie: Z perspektywy czasu powód był oczywisty: ograniczeni użytkownicy mogą łączyć się tylko z bazą danych, w której zostali utworzeni.

Vince Horst
źródło
Chcesz wyjaśnić głosowanie w dół?
Vince Horst
1
Nie byłem ja, ale prawdopodobnie dlatego, że twoja odpowiedź jest swego rodzaju przeciwieństwem pytania. Nadal jest użyteczny, a dzięki złemu projektowi tego okna dialogowego SSMS łatwo popełnić błąd!
Simon_Weaver
0

Może się to zdarzyć, jeśli uruchomisz polecenie PowerShell zawierające ciąg połączenia, gdy hasło zawiera $. Możesz obejść ten problem, dołączając ciąg połączenia pojedynczymi cudzysłowami - lub nie przechowując hasła w ciągu połączenia ;-)

Na przykład. Wpadłem na to z Scaffold-DbContextrozkazem

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

Simon_Weaver
źródło