Database SQL Azure "Accesso non riuscito per l'utente" nell'applicazione, ma funziona correttamente in SSMS


14

Volevo provare la funzionalità degli utenti di database contenuti nel database SQL V12 di Azure, ma sto riscontrando un problema di autenticazione che mi sembra strano.

Ho creato un database chiamato Classifier. Ho aggiunto il mio IP alle regole del firewall in modo da poter connettermi al server db di Azure da SSMS sulla mia workstation. Una volta che sono stato in grado di connettermi tramite SSMS per l'amministrazione, ho provato ad aggiungere un utente con una password al database, in questo modo:

CREATE USER classifier WITH PASSWORD='thepassword'

Ho anche aggiunto questo utente ai ruoli di scrittore e lettore di dati:

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

Successivamente, sono in grado di connettermi al database con queste credenziali da SSMS:

inserisci qui la descrizione dell'immagine

Ma è qui che le cose vanno male: ho provato diversi incantesimi di stringhe di connessione e non riesco a collegarmi in un'app Web su cui sto lavorando. Non ha funzionato nell'ambiente Azure, quindi sto eseguendo localhost con una stringa di connessione al database di Azure e semplicemente non si connetterà. Ecco la stringa di connessione che sto usando al momento:

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

Ho provato a ripristinare la password (tramite SSMS) per l'utente e quindi ad aggiornare la stringa di connessione; Ho anche ricontrollato la password copiandola direttamente da questa stringa di connessione e nella finestra di dialogo di connessione in SSMS per assicurarmi di non avere un refuso di qualche tipo lì.

Ho abilitato il controllo nel server db di Azure sperando di ottenere alcuni dettagli sul perché non funziona, ma tutto ciò che ottengo è questo:

Err 18456, Livello 14, Stato 1, Sever SQL Azure, Riga 1 Accesso non riuscito per l'utente 'classificatore'

Ed è qui che sono bloccato. La maggior parte di ciò che sono stato in grado di trovare tramite documentazione o blog indica che la cosa da fare è guardare i registri di SQL Server per vedere quale sia lo stato di errore reale che indicherebbe più strettamente la natura dell'errore, ma dal momento che Ho a che fare con Azure non c'è modo di farlo (per quanto ne so).

Cosa potrebbe causare il fallimento dell'applicazione in caso di successo di SSMS (e LinqPad e Visual Studio Server Explorer)?

Risposte:


15

Abbiamo scoperto che con database / utenti contenuti è necessario specificare:

GRANT CONNECT TO [YOUR_USER]

Altrimenti CONNECTsembra essere revocato per impostazione predefinita. Dopo aver apportato la modifica sopra, potremmo accedere al database.


Avevamo un account esistente che funzionava e poi ha smesso di funzionare. Ho dovuto concedere nuovamente la connessione ad esso.
Shane Courtrille,

In Azure, ricevo un errore Cannot find the user 'myuser', because it does not exist or you do not have permission.anche se il nome utente esiste in Sicurezza> Accessi ma non MyDatabse> Sicurezza> Utenti. Ho provato CREATE USER [myuser] FOR LOGIN [myuser] WITH DEFAULT_SCHEMA=[mydb] GOma ho ricevuto un erroreThe login already has an account under a different user name.
Korayem,

Ho avuto un problema simile. In ambiente di sviluppo tutto funziona connettendosi ad sql Azure, ma una volta pubblicato, genera quell'errore. Tuttavia non posso eseguire il comando o creare l'utente, qualcuno sta provando qualcosa di diverso?
Ricker Silva,

@dezso Sto affrontando un problema simile. Il mio codice ADO.NET ed EF (DBContext) funziona bene nella macchina locale (non ho provato in Azure) Ma il codice EF implementato usando IdentityDBConext ha esito negativo. Non sono sicuro di cosa c'è che non va o quali funzionalità di IdentityDBConext richiedono l'accesso al server. Ecco la mia domanda originale stackoverflow.com/questions/40260720/…
Hiren Desai,

5

Quando abbiamo cambiato la nostra API per connetterci a un database di Azure tramite un nuovo utente contenuto, abbiamo dovuto modificare la nostra stringa di connessione per includere:

Persist Security Info=True;

Anche se non capisco perché questo cambiamento è stato richiesto, volevo pubblicare qui nel caso in cui aiutasse qualcun altro in futuro.

Inizialmente siamo venuti a provare questo da questa domanda .


2

Il mio problema era diverso, ma correlato: stavo cercando di connettermi a un database SQL di Azure usando SQL Server Management Studio (SSMS) con un utente contenuto . Stavo ricevendo un messaggio "Accesso non riuscito per l'utente" in SSMS.

Soluzione: nelle opzioni di connessione SSMS per la finestra della query avevo impostato "Connetti al database" sul nome del database a cui stavo cercando di connettermi.

Spiegazione: Con il senno di poi il motivo era ovvio: agli utenti contenuti è consentito solo connettersi ai database in cui sono stati creati.


Vuoi spiegare il voto negativo?
Vince Horst,

1
Non sono stato io ma probabilmente perché la tua risposta è un po 'l'opposto della domanda. Ancora utile, però, e grazie alla cattiva progettazione di quella finestra di dialogo SSMS è un errore facile da fare!
Simon_Weaver

0

Ciò può verificarsi se si esegue un comando Powershell contenente una stringa di connessione quando la password contiene $. Puoi aggirare questo problema racchiudendo la stringa di connessione tra virgolette singole o non memorizzando la password nella stringa di connessione in primo luogo ;-)

Per esempio. Mi sono imbattuto in questo con il Scaffold-DbContextcomando

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.