我有一个运行VS 2008的32位XP,我试图从我的C#ASPX文件中的web.config文件解密我的连接字符串。
即使没有返回错误,我当前的连接字符串也不会显示我选择的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”。
答案 0 :(得分:1)
您正在使用的连接字符串是:
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
,他们就看不到密码了。
但是,即使您加密连接字符串,如果连接字符串具有用户名和密码,则该信息将在Web服务器和SQL Server之间以明文发送。但是,使用Integrated Security
不会通过明文发送任何凭据,无论您是否加密连接字符串或web.config。这就是使用它的原因;集成安全性意味着已经登录的Windows帐户将用于通过SQL Server进行身份验证。