Banco de Dados SQL do Azure "Falha no logon para o usuário" no aplicativo, mas funciona bem no SSMS

14

Eu queria experimentar o recurso de usuários de banco de dados contido no Banco de Dados SQL do Azure V12, mas estou tendo um problema de autenticação que me parece estranho.

Eu criei um banco de dados chamado Classifier. Adicionei meu IP às regras de firewall para poder me conectar ao servidor db do Azure a partir do SSMS na minha estação de trabalho. Depois que consegui conectar-me via SSMS para administração, tentei adicionar um usuário com uma senha ao banco de dados, assim:

CREATE USER classifier WITH PASSWORD='thepassword'

Também adicionei esse usuário às funções de gravador e leitor de dados:

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

Depois disso, sou capaz de me conectar ao banco de dados com essas credenciais do SSMS:

insira a descrição da imagem aqui

Mas é aí que as coisas dão errado: tentei vários encantamentos de cadeias de conexão diferentes e parece que não consigo conectar-me a um aplicativo da Web em que estou trabalhando. Como não funcionou no ambiente do Azure, estou executando no host local com uma cadeia de conexão com o banco de dados do Azure e simplesmente não será conectado. Aqui está a cadeia de conexão que estou usando no 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"/>

Tentei redefinir a senha (via SSMS) para o usuário e atualizar a string de conexão; Também verifiquei a senha, copiando-a diretamente desta cadeia de conexão e para a caixa de diálogo de conexão no SSMS, para garantir que não houvesse um erro de digitação.

Habilitei a auditoria no servidor db do Azure na esperança de obter alguns detalhes sobre o motivo da falha, mas tudo o que recebo é o seguinte:

Erro 18456, nível 14, estado 1, servidor SQL do servidor Azure, linha 1 falhou para o usuário 'classificador'

E é aqui que estou preso. A maior parte do que consegui encontrar por meio de documentação ou blogs indica que a coisa a fazer é olhar para os logs do SQL Server para ver qual é o verdadeiro estado do erro que indicaria mais estritamente a natureza da falha, mas desde que eu Como estou lidando com o Azure, não há como fazer isso (tanto quanto eu sei).

O que poderia causar a falha do aplicativo onde o SSMS (e o LinqPad e o Visual Studio Server Explorer, aliás) são bem-sucedidos?

Ben Collins
fonte

Respostas:

15

Descobrimos que, com bancos de dados / usuários contidos, você deve especificar:

GRANT CONNECT TO [YOUR_USER]

Caso contrário, CONNECTparece ser revogado por padrão. Depois de fazer a alteração acima, poderíamos acessar o banco de dados.

HowardvanRooijen
fonte
Tínhamos uma conta existente que estava funcionando e, em seguida, paramos de funcionar. Eu tive que conceder conectar novamente a ele.
Shane Courtrille
No Azure, estou recebendo erro, Cannot find the user 'myuser', because it does not exist or you do not have permission.embora o nome de usuário exista em Segurança> Logins, mas não em MyDatabse> Segurança> Usuários. Eu tentei CREATE USER [myuser] FOR LOGIN [myuser] WITH DEFAULT_SCHEMA=[mydb] GO, mas obteve o erroThe login already has an account under a different user name.
Korayem
Eu tive um problema parecido. No ambiente de desenvolvimento, tudo funciona na conexão com o sql Azure, mas, uma vez publicado, gera esse erro. No entanto, não consigo executar o comando ou criar o usuário, alguém está tentando algo diferente?
Ricker Silva
@dezso Estou enfrentando um problema semelhante. Meu código ADO.NET e EF (DBContext) funciona bem na máquina local (não tentei no Azure), mas o código EF implementado usando o IdentityDBConext falha. Não tenho certeza do que está errado ou quais recursos do IdentityDBConext exigem acesso ao servidor. Aqui está minha pergunta original stackoverflow.com/questions/40260720/…
Hiren Desai
5

Ao mudar nossa API para conectar-se a um banco de dados do Azure por meio de um novo usuário contido, tivemos que alterar nossa cadeia de conexão para incluir:

Persist Security Info=True;

Embora eu não entenda por que essa alteração foi necessária, eu queria postar aqui, caso isso ajude alguém no futuro.

Originalmente, tentamos fazer isso com essa pergunta .

sfm
fonte
2

Meu problema era diferente, mas relacionado: eu estava tentando conectar-me a um banco de dados SQL do Azure usando o SQL Server Management Studio (SSMS) com um usuário contido . Eu estava recebendo uma mensagem "Falha no login do usuário" no SSMS.

Solução: nas opções de conexão SSMS da janela de consulta, eu havia definido "Conectar ao banco de dados" como o nome do banco de dados ao qual estava tentando conectar.

Explicação: Em uma retrospectiva, o motivo era óbvio: os usuários contidos só podem se conectar aos bancos de dados nos quais foram criados.

Vince Horst
fonte
Gostaria de explicar o voto negativo?
Vince Horst
1
Não fui eu, mas provavelmente porque sua resposta é o oposto da pergunta. Ainda é útil e, graças ao design inadequado do diálogo do SSMS, é um erro fácil de cometer!
precisa saber é o seguinte
0

Isso pode ocorrer se você executar um comando do Powershell que contenha uma cadeia de conexão quando sua senha contiver $ . Você pode contornar isso encerrando a cadeia de conexão com aspas simples - ou não armazenando sua senha na cadeia de conexão em primeiro lugar ;-)

Por exemplo. Corri para isso com o Scaffold-DbContextcomando

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

Simon_Weaver
fonte