Seit ungefähr 10 Jahren arbeite ich an verschiedenen internen Desktop-Client-Anwendungen mit SQL Server-Datenspeichern. Selten habe ich diese Projekte gestartet - die meisten sind Übernahmearbeiten.
Eine Sache, die überall konstant schien, war, dass es ein einziges globales SQL Server-Benutzerkonto gab, das von dieser Anwendung verwendet wurde und das die Berechtigung für die gemeinsame Datenbank gewährte, und ja, in einigen naiven Situationen wurde das sa
Benutzerkonto verwendet, das ich im Allgemeinen zu beheben versuchte, wenn es möglich war .
Sie können diesen Benutzernamen und das Kennwort, mit denen die Anwendung auf die Datenbank zugreift, nicht wirklich effektiv verbergen. Sie werden normalerweise in einer ini
oder einer config
Datei gespeichert oder möglicherweise in die ausführbare Datei selbst eingebrannt. In allen Fällen sind sie für den Benutzer sichtbar, wenn er ein wenig gräbt. In einem Fall haben wir tatsächlich eine config
Datei verwendet, diese aber verschlüsselt, aber natürlich musste der Verschlüsselungsschlüssel in der ausführbaren Datei gespeichert werden (wir waren nicht naiv gegenüber den Einschränkungen, aber es hat die Leute effektiv davon abgehalten, sich umzusehen, die geschickt genug waren config
Dateien anschauen ).
Alle diese Systeme verfügten über ein Benutzerauthentifizierungssystem, das in die Anwendung integriert war. Natürlich wurden sie alle über die Anwendung selbst verwaltet, was bedeutet, dass die Benutzerinformationen in der Datenbank gespeichert wurden. Die Anwendung hat die möglichen Aktionen auf der Grundlage Ihrer Zugriffsebene eingeschränkt. Es ist jedoch problematisch, wenn Sie nur eine Verbindung zur Datenbank herstellen und Ad-hoc-Abfragen ausführen können.
Ich bin gespannt, was andere Systeme tun, um dieses Problem zu umgehen. Ich kenne folgende Optionen:
- Verwenden Sie den Sicherheitsmechanismus von SQL Server, um eine Benutzer- und Rollenliste zu verwalten und die Desktopanwendung zu veranlassen, Benutzer über T-SQL-Abfragen hinzuzufügen und zu entfernen.
- Erstellen Sie einen Webservice, der auf dem Server ausgeführt wird, und fügen Sie die Authentifizierungslogik dort ein, anstatt sich direkt mit der Datenbank zu verbinden. Führen Sie bei jeder Anforderung eine Sicherheitsüberprüfung durch.
Die erste Option ist etwas hässlich, da Sie Benutzer von der Datenbank trennen, sodass Benutzer keine erstklassigen Entitäten mehr sind und Sie sie nicht mit Fremdschlüsselbeziehungen usw. referenzieren können.
Die zweite scheint nur ein schwerwiegendes Leistungsproblem zu sein und eine Menge zusätzlicher Arbeit. Außerdem können Sie ORM-Mapper wie NHibernate nicht so einfach verwenden (glaube ich).
Hat jemand Erfahrung damit? Empfohlene Vorgehensweise?
Bearbeiten
Kann die SQL Server-Authentifizierung dieses Problem tatsächlich lösen? Zum Beispiel, wenn Ihre Benutzer in der Lage sein müssen , einzusetzen und zu aktualisieren Zeiterfassungs Aufzeichnungen , so dass Sie Ihre Zeiterfassungs bearbeiten können, gibt es keine Möglichkeit , SQL - Server Zugriff auf andere Zeilen in der Zeitenliste Details Tabelle nicht zulassen kann, das heißt , Sie können lesen und schreiben andere Leute auch die Zeiterfassungen.