Pendant environ 10 ans, j'ai travaillé sur diverses applications clientes de bureau internes avec des magasins de données SQL Server. J'ai rarement commencé ces projets - la plupart sont des travaux de reprise.
Une chose qui semblait constante partout était qu'il y avait un seul compte utilisateur global SQL Server que cette application utilisait qui lui accordait l'autorisation de la base de données commune, et oui dans certaines situations naïves, elle utilisait le sa
compte utilisateur, que j'essayais généralement de corriger lorsque cela était possible .
Vous ne pouvez pas vraiment masquer efficacement ce nom d'utilisateur et ce mot de passe que l'application utilise pour accéder à la base de données. Ils sont généralement stockés dans un ini
ou config
fichier, ou peut - être cuit dans l'exécutable lui - même. Dans tous les cas, ils sont visibles par l'utilisateur s'ils creusent un peu. Dans un cas, nous avons en fait utilisé un config
fichier mais l' avons chiffré, mais bien sûr, la clé de chiffrement devait être stockée dans l'exécutable (nous n'étions pas naïfs face aux limites de cela, mais cela a effectivement empêché les gens de fouiner qui étaient assez avertis regarder dans les config
fichiers).
Tous ces systèmes avaient un système d'authentification utilisateur intégré à l'application, mais bien sûr, ils étaient tous gérés via l'application elle-même, ce qui signifie que les informations utilisateur étaient stockées dans la base de données. L'application restreignait ce que vous pouviez faire en fonction de votre niveau d'accès, mais c'est tout un sujet de discussion si vous pouvez simplement vous connecter à la base de données et exécuter des requêtes ad hoc.
Je suis intéressé de savoir ce que font les autres systèmes pour contourner ce problème. Voici les options que je connais:
- Utilisez le mécanisme de sécurité de SQL Server pour gérer une liste d'utilisateurs et de rôles, et faire en sorte que l'application de bureau ajoute et supprime des utilisateurs via des requêtes T-SQL.
- Au lieu de vous connecter directement à la base de données, créez une sorte de service Web qui s'exécute sur le serveur et placez-y la logique d'authentification. Faites que chaque demande fasse une validation de sécurité.
La première option est un peu moche car vous séparez les utilisateurs de la base de données afin que les utilisateurs ne soient plus des entités de première classe et que vous ne puissiez pas les référencer avec des relations de clé étrangère, etc.
Le second semble juste être un problème de performance majeur, et beaucoup de travail supplémentaire, et vous ne pouvez pas utiliser aussi facilement des mappeurs ORM comme NHibernate (je pense).
Est-ce que quelqu'un a de l'expérience avec ça? Les meilleures pratiques?
Éditer
En réfléchissant un peu plus, l'authentification SQL Server peut-elle réellement résoudre ce problème? Par exemple, si votre utilisateur doit être en mesure d'insérer et de mettre à jour des enregistrements de feuille de temps afin que vous puissiez modifier votre feuille de temps, il n'y a aucun moyen que SQL Server puisse interdire l'accès aux autres lignes du tableau de détails de la feuille de temps, ce qui signifie que vous pouvez également lire et écrire les feuilles de temps d' autres personnes.