SQL Azure не разрешает вход для созданных клиентов

Я создал несколько пользователей для Azure SQL, используя бесплатную учетную запись в базе данных в Azure Data Studio, следуя рекомендуемой процедуре:

  • добавить IP-адреса клиентов в брандмауэр
  • создать логин в базе данных master
  • создавать пользователей
  • добавить соответствующие роли, которые, по крайней мере, включают db_accessadmin

Несмотря на это, мои попытки войти в Azure Data Studio и SSMS по-прежнему терпят неудачу, если я не использую учетную запись администратора, созданную при настройке. Единственная информация об ошибке:

Ошибка входа

Я пытаюсь подключиться со своего IP-адреса и даже добавил свой IP-адрес в брандмауэр базы данных. Я что-то упускаю?

ИЗМЕНИТЬ

Команда, запускаемая на главном сервере, для создания пользователя [имя пользователя и пароль изменены]:

CREATE LOGIN userlogin WITH PASSWORD='my_password';

Команды выполняются в базе данных:

CREATE USER myuser FROM LOGIN userlogin;
ALTER ROLE db_datawriter ADD MEMBER myuser;
ALTER ROLE db_datareader ADD MEMBER myuser;
ALTER ROLE db_accessadmin ADD MEMBER myuser;

Подробная информация из данных Azure при попытке доступа к базе данных:

Microsoft.Data.SqlClient.SqlException (0x80131904): Login failed for user 'myuser'.
   at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at Microsoft.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken, DbConnectionPool pool, SqlAuthenticationProviderManager sqlAuthProviderManager)
   at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionFactory.<>c__DisplayClass40_0.<TryGetConnection>b__1(Task`1 _)
   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection.ReliableSqlConnection.<>c__DisplayClass30_0.<<OpenAsync>b__0>d.MoveNext() in D:\a\1\s\src\Microsoft.SqlTools.ManagedBatchParser\ReliableConnection\ReliableSqlConnection.cs:line 314
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.SqlTools.ServiceLayer.Connection.ConnectionService.TryOpenConnection(ConnectionInfo connectionInfo, ConnectParams connectionParams) in D:\a\1\s\src\Microsoft.SqlTools.ServiceLayer\Connection\ConnectionService.cs:line 549
ClientConnectionId:0682c1d3-d252-4379-b0b2-c00364e90356
Error Number:18456,State:1,Class:14

ИЗМЕНИТЬ 2

Ну, немного почесав в голове, я нашел SSMS. Он работает как шарм, используя те же команды. Не уверен, но у команд по умолчанию было N перед ролями и ролью пользователя. Он также переключился с FROM LOGIN на FOR LOGIN, хотя я просто некоторое время использую Azure Data Studio.


person Andrew Scott Evans    schedule 10.07.2020    source источник
comment
Ошибка возвращается быстро или пауза превышает 10 секунд. Как долго вы оцените, прежде чем вы получите сообщение об ошибке? Вы пробовали использовать пользователя / пароль по умолчанию, созданный при создании Azure SQL?   -  person Ron    schedule 10.07.2020
comment
@Ron Значения по умолчанию работают. Это довольно быстро. Я предполагал, что у меня может быть более 1 пользователя   -  person Andrew Scott Evans    schedule 10.07.2020
comment
Вы можете, только начиная с основ, видели ли вы эту статью? docs.microsoft.com/en-us/sql/t-sql/statements/ docs.microsoft.com/en-us/azure/azure-sql/database/   -  person Ron    schedule 10.07.2020
comment
@ Рон, да. вот в чем дело. Я добавил логин для мастера и пользователя в базу данных, используя логин. даже добавил IP-адрес в брандмауэр базы данных, но ошибка в sys.event_log - login_failed_for_user. Я использую имя пользователя и пароль. скопировал их из команды, использованной для создания пользователя (из блокнота)   -  person Andrew Scott Evans    schedule 10.07.2020
comment
можешь добавить команды в пост? Конечно, используйте поддельное имя пользователя и поддельный пароль. Сейчас вы знаете, что это не проблема брандмауэра. Если бы это был брандмауэр, у вас будет задержка для ошибки, или SSMS предложит вам добавить ваш IP-адрес. Если пользователь настроен и ему предоставлен доступ к БД. Тогда единственное, о чем я могу думать, - это либо у пользователя нет прав на вход, либо у него неверный пароль. Наблюдая за выполненными вами командами, можно увидеть, было ли что-то упущено, также позволяет проводить тестирование.   -  person Ron    schedule 10.07.2020
comment
@Ron добавил, спасибо   -  person Andrew Scott Evans    schedule 10.07.2020
comment
Microsoft.Data.SqlClient.SqlException (0x80131904): ошибка входа для пользователя myuser. Это myuser из строки создания входа в систему или из строки создания пользователя? (возможно, вам следовало использовать только поддельный пароль, поскольку вы указали исключение). Предполагая, что myuser был тем, что вы создали с помощью строки входа в систему. Я бы, наверное, просто попробовал сбросить пароль   -  person Ron    schedule 10.07.2020
comment
Пользователь @Ron должен был быть myuser. Я использовал его в базе данных пользователей. Я задумал найти замену. Правильное имя пользователя появляется в моем фактическом развертывании и использовалось при попытке подключения.   -  person Andrew Scott Evans    schedule 10.07.2020
comment
В приведенной выше ситуации вы используете в строке подключения userlogin, а не myuser. Сорир просто хотел уточнить. СОЗДАТЬ ВХОД userlogin С ПАРОЛЕМ = 'my_password'; СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ myuser ИЗ ВХОДА userlogin;   -  person Ron    schedule 10.07.2020
comment
@ Рон. Спасибо за помощь. По какой-то причине это сработало, когда я использовал CREATE USER myuser FOR LOGIN вместо FROM LOGIN   -  person Andrew Scott Evans    schedule 11.07.2020


Ответы (1)


Проблема заключалась в том, что вы случайно использовали FOR вместо From. Большая часть документации, которую я видел, показывает, что это не имеет значения. Единственное, что я мог придумать, это то, что если у вас есть раздел замечаний [https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql- server-ver15 # примечания]

Пример явно использует from, тогда есть другие ссылки от внешних провайдеров. Интересно, есть ли что-то, от чего, возможно, требуется AD.

Возможно, в матрице произошел сбой.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql-server-ver15.

Просто рад, что у тебя все получилось, и что я смог помочь.

person Ron    schedule 13.07.2020