Przez około 10 lat pracowałem nad różnymi wewnętrznymi aplikacjami klienckimi z magazynami danych SQL Server. Rzadko zaczynałem te projekty - większość z nich to prace związane z przejęciem.
Jedną rzeczą, która wydawała się stała wszędzie, było to, że było jedno globalne konto użytkownika SQL Server, z którego korzystała ta aplikacja, co dawało mu uprawnienia do wspólnej bazy danych, i tak, w niektórych naiwnych sytuacjach korzystało z sa
konta użytkownika, które ogólnie próbowałem naprawić, gdy to możliwe .
Naprawdę nie można skutecznie ukryć tej nazwy użytkownika i hasła, których aplikacja używa do uzyskania dostępu do bazy danych. Są one zazwyczaj przechowywane w ini
lub config
pliku, lub ewentualnie pieczone na wykonywalny sama. We wszystkich przypadkach są widoczne dla użytkownika, jeśli wykonają małe kopanie. W jednym przypadku faktycznie użyliśmy config
pliku, ale go zaszyfrowaliśmy, ale oczywiście klucz szyfrowania musiał być przechowywany w pliku wykonywalnym (nie byliśmy naiwni wobec ograniczeń tego, ale skutecznie powstrzymywał ludzi od szukania informacji, którzy byli wystarczająco bystrzy przeglądać config
pliki).
Wszystkie te systemy miały wbudowany w aplikację system uwierzytelniania użytkowników, ale oczywiście wszystkie były zarządzane przez samą aplikację, co oznacza, że informacje o użytkowniku były przechowywane w bazie danych. Aplikacja ograniczyła to, co możesz zrobić na podstawie twojego poziomu dostępu, ale to wszelkiego rodzaju dyskusja, jeśli możesz po prostu połączyć się z bazą danych i uruchomić zapytania ad-hoc.
Chcę wiedzieć, co robią inne systemy, aby obejść ten problem. Oto opcje, które znam:
- Użyj mechanizmu bezpieczeństwa programu SQL Server, aby utrzymać listę użytkowników i ról, a następnie dodaj i usuń użytkowników za pomocą zapytań T-SQL.
- Zamiast łączyć się bezpośrednio z bazą danych, utwórz usługę sieci Web działającą na serwerze i umieść tam logikę uwierzytelniania. Każdemu żądaniu dokonaj weryfikacji bezpieczeństwa.
Pierwsze opcje są nieco brzydkie, ponieważ oddzielasz użytkowników od bazy danych, więc użytkownicy nie są już jednostkami pierwszej klasy i nie możesz odwoływać się do nich za pomocą relacji klucza obcego itp.
Drugi wydaje się być poważnym problemem związanym z wydajnością i dużo dodatkowej pracy, a ponadto nie można tak łatwo korzystać z maperów ORM, jak NHibernate (tak myślę).
Czy ktoś ma z tym doświadczenie? Najlepsze praktyki?
Edytować
Zastanawiając się trochę, czy uwierzytelnianie programu SQL Server faktycznie rozwiązuje ten problem? Na przykład, jeśli użytkownik musi mieć możliwość wstawiania i aktualizowania rekordów grafiku, aby móc edytować grafik, nie ma mowy, aby serwer SQL zabronił dostępu do innych wierszy w tabeli szczegółów grafiku, co oznacza, że można również czytać i zapisywać grafiki innych osób.