none
ConnectionString / Passwort RRS feed

  • Frage

  • Guten Abend.

    ich habe mal auf meinem Server MySql installiert. Um auf die Daten zuzugreifen habe ich in meinem VB.NET-Projekt ein "ADO.NET Entity Data Model" hinzugefügt. Funktioniert soweit, hat sich ja richtig was getan in den letzten Jahren, was die Unterstützung Seitens MySql und VisualStudio angeht.

    Aber ich möchte natürlich nicht in meiner Web.Config oder App.Config den ConnectionString im Klartext stehen haben. Erst recht nicht das Passwort.  Ich möchte in meinem Klassen, wo es auch letztendlich zu den Datenbankzugriffen kommt, den ConnectionString selbst aufbauen bzw. um die fehlenden Angaben ergänzen.

    Also jetzt geht es mir in erster Linie um das Passwort. Das liegt "versteckt" und zusätzlich verschlüsselt in einer JPEG-Datei welche sich in den Resourcen der DLL befindet. Aber wie bringe ich das Passwort rein?

    Wenn ich Programmatisch reinschreibe:

    DB2.Connection.ConnectionString += ";pwd=Test"

    Dann bekomme ich als Antwort (zur Laufzeit) "Schlüsselwort wird nicht unterstützt: 'pwd'." Das gleiche passiert auch mit "password". DB2 ist übrigens das Entity-Model (der Vollständigkeit halber).

    Meine Frage: Wie kann ich in einem bestehenden Entity-Model den ConnectionString anpassen? Er ist nicht ReadOnly und eigentlich richtig, wird aber nicht akzeptiert. Mit Absicht oder habe ich einen gewaltigen Denkfehler?

    Gruß
    Andy

    Freitag, 15. August 2014 18:37

Antworten

  • So, jetzt, wo ich meinen Denkfehler (endlich) selbst bemerkt habe, hier die Lösung:

    Imports System
    Imports System.Collections.Generic
    Imports System.Collections
    Imports System.Data.Common
    Imports System.Data
    Imports System.IO
    Imports System.Data.SqlClient
    Imports System.Data.EntityClient
    Imports System.Data.Metadata.Edm
    
    Public Sub Test()
            ' Specify the provider name, server and database. 
            Dim providerName As String = "MySql.Data.MySqlClient"
            Dim serverName As String = "localhost"
            Dim databaseName As String = "MeineDB"
            Dim UserId As String = "Mayer"
            Dim UserPwd As String = "Geheim"
    
            ' Initialize the connection string builder for the 
            ' underlying provider. 
            Dim sqlBuilder As New SqlConnectionStringBuilder()
    
            ' Set the properties for the data source. 
            sqlBuilder.DataSource = serverName
            sqlBuilder.InitialCatalog = databaseName
            sqlBuilder.IntegratedSecurity = False
            sqlBuilder.Add("user id", UserId)
            sqlBuilder.Add("pwd", UserPwd)
    
            ' Build the SqlConnection connection string. 
            Dim providerString As String = sqlBuilder.ToString()
    
            ' Initialize the EntityConnectionStringBuilder. 
            Dim entityBuilder As New EntityConnectionStringBuilder()
    
            'Set the provider name. 
            entityBuilder.Provider = providerName
    
            ' Set the provider-specific connection string. 
            entityBuilder.ProviderConnectionString = providerString
    
            ' Set the Metadata location - DB ist das Entity-Model 
            ' Wer ein ADO.NET Entity-Model mit einem anderen Namen erstellt, sollte überall das entsprechend DB austauschen
            entityBuilder.Metadata = "res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl"
    
            Using conn As New EntityConnection(entityBuilder.ToString())
                conn.Open()
                MsgBox(conn.State.ToString)
                conn.Close()
            End Using
    
            ' Test mit einer LINQ-Abfrage
            Dim DB As New DbEntities(entityBuilder.ToString)
            Dim Daten = From u In DB.tbl_users Order By u.LastLogin Descending
    
            For Each rs In Daten
                MsgBox(rs.Username)
            Next
    End Sub

    Hiermit kann eine Verbindung mit ADO.NET Entity-Model zu einem MySql-Server aufgebaut werden, ohne den ConnectionString in der Web.Config bzw. in der App.Config im Klartext abzulegen.

    Gruß
    Andy


    Freitag, 15. August 2014 19:14

Alle Antworten

  • Nachtrag:

    Ich sehe meinen Denkfehler, löst aber nicht mein Problem :-D

    Es wird in der App.Config kein "wirklicher" ConnectionString erstellt. Sondern ein ConnectionString im ConnectionString. Deshalb mochte er auch das pwd" nicht.

    connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;user id=... ... ...
    Gruß
    Andy

    Freitag, 15. August 2014 18:51
  • So, jetzt, wo ich meinen Denkfehler (endlich) selbst bemerkt habe, hier die Lösung:

    Imports System
    Imports System.Collections.Generic
    Imports System.Collections
    Imports System.Data.Common
    Imports System.Data
    Imports System.IO
    Imports System.Data.SqlClient
    Imports System.Data.EntityClient
    Imports System.Data.Metadata.Edm
    
    Public Sub Test()
            ' Specify the provider name, server and database. 
            Dim providerName As String = "MySql.Data.MySqlClient"
            Dim serverName As String = "localhost"
            Dim databaseName As String = "MeineDB"
            Dim UserId As String = "Mayer"
            Dim UserPwd As String = "Geheim"
    
            ' Initialize the connection string builder for the 
            ' underlying provider. 
            Dim sqlBuilder As New SqlConnectionStringBuilder()
    
            ' Set the properties for the data source. 
            sqlBuilder.DataSource = serverName
            sqlBuilder.InitialCatalog = databaseName
            sqlBuilder.IntegratedSecurity = False
            sqlBuilder.Add("user id", UserId)
            sqlBuilder.Add("pwd", UserPwd)
    
            ' Build the SqlConnection connection string. 
            Dim providerString As String = sqlBuilder.ToString()
    
            ' Initialize the EntityConnectionStringBuilder. 
            Dim entityBuilder As New EntityConnectionStringBuilder()
    
            'Set the provider name. 
            entityBuilder.Provider = providerName
    
            ' Set the provider-specific connection string. 
            entityBuilder.ProviderConnectionString = providerString
    
            ' Set the Metadata location - DB ist das Entity-Model 
            ' Wer ein ADO.NET Entity-Model mit einem anderen Namen erstellt, sollte überall das entsprechend DB austauschen
            entityBuilder.Metadata = "res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl"
    
            Using conn As New EntityConnection(entityBuilder.ToString())
                conn.Open()
                MsgBox(conn.State.ToString)
                conn.Close()
            End Using
    
            ' Test mit einer LINQ-Abfrage
            Dim DB As New DbEntities(entityBuilder.ToString)
            Dim Daten = From u In DB.tbl_users Order By u.LastLogin Descending
    
            For Each rs In Daten
                MsgBox(rs.Username)
            Next
    End Sub

    Hiermit kann eine Verbindung mit ADO.NET Entity-Model zu einem MySql-Server aufgebaut werden, ohne den ConnectionString in der Web.Config bzw. in der App.Config im Klartext abzulegen.

    Gruß
    Andy


    Freitag, 15. August 2014 19:14
  • Hallo,
    auch wenn du dein Passwort noch so sehr verschlüsselt in die Anwendung steckst, sobald der Endbenutzer das Programm hat, kann er relativ leicht trotzdem heran kommen. Beispielweise könnte er wieder den Quellcode aus der Anwendung generieren und so Stück für Stück auf den Speicherort des Passwortes schliesen. Auch das Auslesen der Resourcen stellt dabei kein Problem dar. Eine Verschlüsslung macht nur dann Sinn, wenn das Passwort zum Entshclüsseln nicht in der Anwendung steckt und auch nicht auf den Client Computer übertragen wird.

    Ich weiß nicht, wie es mit ADO.NET genau funktioniert, aber typischer weise schreibt man dafür einen Webservice, dem dnn einfach die Daten übergeben werden. Der Webservice kennt dann das Passwort usw und trägt alles in die DB ein. Da der Benutzer selbst nie an den Service heran kommt, stellt das kein Sicherheitsrisiko dar.
    Beispielsweise könntest du bei einer ASP.NET Anwendung den ConnString durchaus in der Web.config speichern, wiel sowieso keiner heran kommt.

    In Sachen Webvservice kann ich dir nur etwas mit ASP.NET helfen. Siehe auch Your first C# Web Service
    Du kannst so etwas auch in PHP o.ä. implementieren, allerdings kann ich dir dabei nicht helfen.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 15. August 2014 21:57
    Moderator