Laden...

Wie kann ich von C# auf MySQL Zugreifen ohne die Zugangsdaten hart im Code zu speichern?

Erstellt von Lucius vor 3 Jahren Letzter Beitrag vor 3 Jahren 976 Views
L
Lucius Themenstarter:in
18 Beiträge seit 2020
vor 3 Jahren
Wie kann ich von C# auf MySQL Zugreifen ohne die Zugangsdaten hart im Code zu speichern?

Hallo, ich bin noch neu und hoffe in Zukunft hier einiges lernen zu können.

Ich habe mal früher viel in VB programmiert und wollte unbedingt in C# umlernen.
Mein Problem ist, das einiges aus der Zeit VB her ist und durch bestimmte Versionswechsel von PHP dazu geführt haben das alte PHP Files nicht mehr so funktionieren.

Eigentlich ist mir persönlich nur Wichtig, das ich von C# aus, eine Datenbank entweder abrufen oder ändern sowie Löschen kann. Zusätzlich möchte ich ein kleines Login darüber schreiben.

Ich habe einiges zwar darüber gefunden, nur leider werden ständig die Zugangsdaten der Mysql Datenbank in das C# Programm eingetragen, ich hatte das früher so, das ich eine PHP Datei hatte und in dieser der größte teil des MYSQLI stand und nur mit dem Programm abgeglichen werden musste.

Die Verbindung wurde über PHP durchgeführt und nicht durch das Programm. Jetzt bin ich hier nach einer Lösung, ob jemand ein Snippet kennt, das diese Möglichkeiten mitbringt?

lg Lucius

16.807 Beiträge seit 2008
vor 3 Jahren

Du kannst mit C# direkt auf MySQL zugreifen (über ADO.NET und dem entsprechend offiziellen MySQL Driver).
Du kannst aber von C# auf PHP auf MySQL zugreifen; das ist ein doppelter Technologiebruch.

Du kannst aber mit PHP Daten aus MySQL laden, diese über ein REST-Schnittstelle zur Verfügung stellen und das dann von C# aus aufrufen.

Nen Snippet dazu werde ich Dir aber nicht raus suchen; das kannste ja mit den Stichworten selbst. Bin sicher, dass Du alt und eigenständig genug dazu bist 😉

Das Vorhaben ist aber insgesamt - zumindest die Erklärung - kurios.
Wenn möglich würde ich PHP einfach aus dem Spiel lassen und direkt mit C# auf MySQL zugreifen.
Google-Suche nach c# mysql

L
Lucius Themenstarter:in
18 Beiträge seit 2020
vor 3 Jahren

Danke dir für deine Antwort 😃

Mir ist es nur wichtig, das die Zugangsdaten der MYSQL Datenbank nicht im Programmcode gespeichert werden. Und das kann Ado.net?

H
523 Beiträge seit 2008
vor 3 Jahren

Das kannst Du selber steuern.

L
Lucius Themenstarter:in
18 Beiträge seit 2020
vor 3 Jahren

Hmm, ich finde irgendwie nicht das richtige dazu?

H
523 Beiträge seit 2008
vor 3 Jahren

Auf der MySQL-Seite gibt's entsprechende Beispiele

M
368 Beiträge seit 2006
vor 3 Jahren

Die Logindaten lassen sich auch in eine externe .cs Datei eintragen (analog wie .inc bei PHP): Beispiel bei 07planning

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

H
523 Beiträge seit 2008
vor 3 Jahren

Speicher die Datenbankzugangsdaten (verschlüsselt) in einer Konfigurationsdatei (dafür bietet .NET auch schon entsprechende Klassen).

P
441 Beiträge seit 2014
vor 3 Jahren

Entschuldigt, dass ich soviel Quote, ich wollte das aber nicht unkommentiert stehen lassen.

Die Logindaten lassen sich auch in eine externe .cs Datei eintragen (analog wie .inc bei PHP)

Das ist nicht analog wie bei PHP.
Der Unterschied: c# wird kompiliert und alle *.cs Dateien innerhalb eines Projektes als IL Code in einer .dll (oder .exe oder bin) zusammengefasst.
In der analogie zu PHP wäre hier eine Konfigurationsdatei, die vom Code gelesen wird (analog zu require_once in PHP). Prinzipiell sind die Vergleiche aber etwas mühsam, weil PHP und C# sehr unterschiedlich funktionieren!

(dafür bietet .NET auch schon entsprechende
>
).

Ich würde in jedem Fall das Konfigurationsmodell von .NET Core empfehlen: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1
Das ermöglicht sowohl verschlüsselte Quellen für Zugangsdaten, Authentifizierte und Lokale. Damit hat man die beste Flexibilität.
Das funktioniert auch für Desktop (WPF/WinForms) Apps. Allerdings führt das quasi jeden Login Mechanismus ad absurdum, wenn nicht der Login der gleiche wie für die Datenbank ist.
Auch muss immer Hinterfragt werden, ob ein Desktop Programm direkt auf eine Datenbank zugreifen sollte!

@Lucius:
Am besten wäre es, du arbeitest dich in die Grundlagen von der nicht mehr ganz so neuen C# Welt in Form von .NET Core (bzw. jetzt kommend .NET 5) ein.
Da werden viele dieser Frage mit gut funktionierenden Konzepten beantwortet.

16.807 Beiträge seit 2008
vor 3 Jahren

Die Logindaten lassen sich auch in eine externe .cs Datei eintragen (analog wie .inc bei PHP)

Speicher die Datenbankzugangsdaten (verschlüsselt) in einer Konfigurationsdatei

Sollte man beides im Jahr 2020 nicht unbedingt mehr tun - übrigens auch nicht in PHP.
Als sicherer gelten hier die Umgebungsvariablen.

Für Webanwendung über die Verwaltung des Webservers.
Für Desktop Anwendungen bei Windows der Windows Credential Manager.

Hmm, ich finde irgendwie nicht das richtige dazu?

Wenn man die Zeitabstände Deiner Beiträge beachtet und auch Dein Thema Wie teile ich ein Array? dann scheinst Du zum einen offenbar nicht richtig zu suchen oder zu suchen zu wollen, geschweige denn in die Dokumentation zu schauen und zum anderen fehlen Dir die minimalsten Grundlagen.
Und wenn schon der Blick in die Dokumentation für Dich zuviel Arbeit ist....

Beschäftige Dich erst mal damit, wie C# funktioniert.
Ansonsten ist das als ob Du versuchst einen Nagel in die Wand zu schlagen und nicht weißt wie ein Hammer funktioniert.

[FAQ] Wie finde ich den Einstieg in C#?

309 Beiträge seit 2020
vor 3 Jahren

Du kannst mit C# direkt auf MySQL zugreifen (über ADO.NET und dem entsprechend offiziellen MySQL Driver).

Wieso denn ADO.NET?! Sollte man das überhaupt noch verwenden anstelle von EF?

16.807 Beiträge seit 2008
vor 3 Jahren

EF ist nichts anderes als ein ORM und verwendet unter der Haube ADO.NET.
EF hat genug Nachteile als dass man durchaus auch direkt mit ADO.NET arbeiten kann, ohne den EF Überzug.

What is ADO.NET?
Wie Du hier nachgelesen kannst ist ADO.NET quasi die Plattform, die Abstraktion für den Umgang mit verschiedenen Datenquellen in .NET, wobei ADO.NET alle Quellen unterstützt, die dann Provider (aka Driver) für ADO.NET liefern (MSSQL, MySQL, Sqlite...).

Das Problem hier im Thema kann direkt gelöst werden (mit ADO.NET) oder durchaus auch mit ORM wie EF oder Dapper oder....

Zusatz als Edit:
Ich bin ein großer Fan vom EF Core (anders als EF6) - es ist wunderbar zu nutzen.
Aber EF ist kein Allheilmittel und für gewisse Dinge muss man zwingend ADO.NET direkt nutzen, zB Views und Co (was auch über EF Core geht).

H
523 Beiträge seit 2008
vor 3 Jahren

Sollte man beides im Jahr 2020 nicht unbedingt mehr tun - übrigens auch nicht in PHP.
Als sicherer gelten hier die Umgebungsvariablen.

Aus Interesse: Warum sind Umgebungsvariablen sicherer?

16.807 Beiträge seit 2008
vor 3 Jahren

Aus Interesse: Warum sind Umgebungsvariablen sicherer?

Prinzipiell gilt die Verwaltung von Credentials durch die "Umgebung" als die sicherste Variante.
Für die konkrete Umsetzung zB. einer Desktop App das in der Regel das Betriebssystem und im konkreten Fall von Windows eben der Credential Manager.
Wer mal einen Blick rein wirft der sieht auch, dass quais alle Windows oder auch zB. Microsoft Applikationen (zB Office Suite) aber auch zB. Git hier seine Credentials hinterlegt.

Damit wird sichergestellt, dass der Zugriff nur im Betriebssystem-Kontext (zB angemeldeter Benutzer) möglich ist. Credentials in Dateien kann jeder sehen, der Zugriff auf die Datei hat - egal wo sie liegt.

Basierend auf diesem Mechanismus funktionieren im Prinzip auch alle Enterprise Secret Manager, wie zB Azure KeyVault, Hashicorp Vault, AWS Secret Manager:
Der Zugriff auf den Vault ist nur durch die Managed Identity möglich, wobei die Managed Identity durch die Umgebung (Azure, AWS, Kubernetes Cluster..) erzeugt oder mindestens aktiv verwaltet wird.

Konkretes Beispiel:
Der Zugriff auf Azure KeyVault ist nur von Azure-Services aus möglich; nicht von Deinem PC. Dein PC liegt schließlich nicht in der Hoheit von Azure; der Service hingehen schon.
Eine Managed Identity ist dabei zB. die Webanwendung, sodass auch wirklich nur diese Applikation Zugriff auf zB. Datenbank-Credentials hat.

Konkrete Azure Lekture:
What are managed identities for Azure resources?

Die .NET CLI hat seit längerem schon die Unterstützung von User Secrets während der Entwicklungszeit, sodass man auch gar nicht in die Versuchung kommen muss, irgendwelche Credentials in Dateien zu packen und gar eventuell einzuschecken.

Das funktioniert mit allen Applikationen, die den Microsoft.Extensions.Configurations entsprechend nutzen.
Die Docs hier liegen unter ASP.NET Core, weil es hier besonders wichtig ist, dass eben die Credentials nicht in Dateien liegen Safe storage of app secrets in development in ASP.NET Core