Как получить доступ к строке подключения web.config в C #? - PullRequest
1 голос
/ 24 апреля 2010

У меня 32-битная XP, работающая под управлением VS 2008, и я пытаюсь расшифровать строку подключения из файла web.config в моем файле C # ASPX.

Даже при отсутствии ошибок, текущая строка подключения не отображает содержимое выбранной хранимой процедуры AdventureWorks.

Я ввел его:

C:\Program Files\Microsoft Visual Studio 9.0\VC>Aspnet_regiis.exe -pe "connectionStrings" -app "/AddFileToSQL2"

Тогда он сказал "Успешно".

А мой раздел web.config выглядит так:

  <connectionStrings>
    <add name="Master" connectionString="server=MSSQLSERVER;database=Master; Integrated Security=SSPI"
      providerName="System.Data.SqlClient" />
    <add name="AdventureWorksConnectionString" connectionString="Data Source=SIDEKICK;Initial Catalog=AdventureWorks;Integrated Security=True"
      providerName="System.Data.SqlClient" />
      <add name="AdventureWorksConnectionString2" connectionString="Data Source=SIDEKICK;Initial Catalog=AdventureWorks;Persist Security Info=true; "
  providerName="System.Data.SqlClient" />
  </connectionStrings>

А мой код на C # выглядит следующим образом:

    string connString = ConfigurationManager.ConnectionStrings["AdventureWorksConnectionString2"].ConnectionString;

Что-то не так со строкой соединения в файле web.config или C # за файлом?

Я установил точку останова в коде C # и теперь получаю исключение ниже:

System.Data.SqlClient.SqlException was caught
  Message="Login failed for user ''."
  Source=".Net SqlClient Data Provider"
  ErrorCode=-2146232060
  Class=14
  LineNumber=65536
  Number=18456
  Procedure=""
  Server="SIDEKICK"
  State=1
  StackTrace:
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
       at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
       at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
       at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
       at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
       at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
       at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.SqlClient.SqlConnection.Open()
       at ADONET_namespace.ADONET_methods.DisplaySchemaTables() in C:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\AddFileToSQL2\AddFileToSQL\Admins\ADONET methods.cs:line 65
  InnerException: 

Кроме того, я добавил веб-элемент управления LoginView для защиты своего веб-сайта. Имя пользователя: «tester».

1 Ответ

1 голос
/ 24 апреля 2010

Используемая вами строка подключения:

Data Source=SIDEKICK;Initial Catalog=AdventureWorks;Persist Security Info=true;

Это неправильно. У вас нет Integrated Security=True, что означает, что он не будет использовать аутентификацию Windows. И у вас также не определен User Name / Password, поэтому он не будет использовать логин SQL Server.

Итак, ваша строка подключения пытается войти без каких-либо учетных данных, поэтому вы получаете это сообщение об ошибке.

Чтобы это исправить, вам нужно вернуть Integrated Security=True (чтобы использовать текущую идентификационную информацию пользователя Windows), или вам нужно ввести определенное имя пользователя и пароль.


Также, читая ваши комментарии, обратите внимание на разницу между незашифрованной строкой соединения и отправкой пароля через открытый текст:

  • Зашифрованная строка соединения полезна, когда вы храните учетную информацию (например, пароль) в файле web.config. Если кому-то удастся заполучить web.config, он не сможет увидеть пароль.

  • Однако, даже если вы шифруете строку подключения, если строка подключения имеет имя пользователя и пароль, эта информация передается в виде открытым текстом между веб-сервером и SQL Server. Однако при использовании Integrated Security не отправляет какие-либо учетные данные в виде открытого текста, независимо от того, зашифрованы ли строка подключения или web.config. Вот причина, чтобы использовать его; Интегрированная безопасность означает, что любая учетная запись Windows, уже вошедшая в систему, будет использоваться для аутентификации в SQL Server.

...