2010-04-24 4 views
1

J'ai un XP 32 bits tournant VS 2008 et j'essaie de décrypter ma chaîne de connexion de mon fichier web.config dans mon fichier C# ASPX.Comment accéder à la chaîne de connexion web.config en C#?

Même s'il n'y a pas d'erreur renvoyée, ma chaîne de connexion actuelle n'affiche pas le contenu de ma procédure stockée AdventureWorks sélectionnée.

J'y suis entré:

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

Ensuite, il a dit "succeeded".

Et ma section web.config ressemble:

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

Et mon code C# regarde derrière comme:

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

Y at-il quelque chose de mal avec la chaîne de connexion dans le web.config ou C# code derrière le fichier?

Je mis un point d'arrêt dans le code C# derrière et maintenant je l'exception ci-dessous:

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: 

De plus, j'ai ajouté un contrôle Web LoginView pour sécuriser mon site. Le nom de connexion est "testeur".

+0

Pourquoi pensez-vous qu'il y a un problème avec la chaîne de connexion? Avez-vous vérifié le sproc? Est-ce qu'il renvoie des données lorsque vous l'appelez directement à partir de SQL Management Studio ou lorsque vous passez le code? –

+1

Avez-vous une erreur? Au lieu de "Persist Security Info = true" essayez ceci dans Connectionstring2 "Integrated Security = True" – Raja

+0

Oui, le sproc renvoie correctement les données dans SSMS. Cependant, j'ai mis un point d'arrêt à cette partie dans le code C# derrière et je mets à jour cette exception ci-dessus. – salvationishere

Répondre

1

La chaîne de connexion que vous utilisez est la suivante:

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

C'est faux. Vous n'avez pas Integrated Security=True, ce qui signifie qu'il n'utilisera pas l'authentification Windows. Et vous n'avez pas non plus de User Name/Password défini, donc il n'utilisera aucune connexion SQL Server. Par conséquent, votre chaîne de connexion essaie de se connecter sans aucune information d'identification. C'est la raison pour laquelle vous obtenez ce message d'erreur. Pour corriger le problème, vous devez mettre Integrated Security=True en arrière (pour utiliser l'identité d'utilisateur Windows actuelle) ou vous devez entrer un nom d'utilisateur et un mot de passe spécifiques.


En outre, la lecture de vos commentaires, s'il vous plaît noter la différence entre une chaîne de connexion non enecrypted et l'envoi d'un mot de passe sur le texte clair:

  • Une chaîne de connexion cryptée est utile lorsque vous êtes stocker des informations d'identification (telles qu'un mot de passe) dans votre fichier web.config. Si quelqu'un parvient à mettre la main sur le web.config, il ne peut pas voir le mot de passe.

  • Cependant, même si vous cryptez la chaîne de connexion, si la chaîne de connexion a un nom d'utilisateur et mot de passe ces informations sont envoyées dans texte clair entre le serveur Web et SQL Server. Toutefois, en utilisant Integrated Security, et non envoie des informations d'identification par texte clair, que vous cryptiez ou non la chaîne de connexion ou le fichier web.config. C'est la raison de l'utiliser; La sécurité intégrée signifie que quel que soit le compte Windows déjà connecté sera utilisé pour s'authentifier avec SQL Server.

+0

Merci beaucoup, Aaron! C'est exactement ce dont j'avais besoin! – salvationishere

Questions connexes