Trong khoảng 10 năm, tôi đã làm việc trên các ứng dụng máy khách để bàn trong nhà khác nhau với các kho dữ liệu SQL Server. Hiếm khi tôi bắt đầu những dự án này - hầu hết là công việc tiếp quản.
Một điều dường như không đổi ở mọi nơi là có một tài khoản người dùng SQL Server toàn cầu duy nhất mà ứng dụng này đã sử dụng đã cấp quyền cho cơ sở dữ liệu chung và có trong một số tình huống ngây thơ, nó thường sử sa
dụng tài khoản người dùng mà tôi thường cố gắng khắc phục khi có thể .
Bạn thực sự không thể ẩn tên người dùng và mật khẩu này mà ứng dụng sử dụng để truy cập cơ sở dữ liệu. Chúng thường được lưu trữ trong một ini
hoặc config
tập tin, hoặc có thể được nướng vào chính tệp thực thi. Trong mọi trường hợp, chúng sẽ hiển thị cho người dùng nếu họ đào một ít. Trong một trường hợp, chúng tôi thực sự đã sử dụng một config
tệp nhưng đã mã hóa nó, nhưng tất nhiên khóa mã hóa phải được lưu trữ trong tệp thực thi (chúng tôi không ngây thơ trước những hạn chế của việc này, nhưng nó thực sự ngăn mọi người chọc vào những người đủ hiểu biết để tìm trong config
các tập tin).
Tất cả các hệ thống này đều có hệ thống xác thực người dùng được tích hợp trong ứng dụng, nhưng tất nhiên chúng đều được quản lý thông qua chính ứng dụng, nghĩa là thông tin người dùng được lưu trữ trong cơ sở dữ liệu. Ứng dụng đã hạn chế những điều bạn có thể làm dựa trên cấp độ truy cập của mình, nhưng tất cả đều là loại nếu bạn chỉ có thể kết nối với cơ sở dữ liệu và chạy các truy vấn đặc biệt.
Tôi muốn biết những hệ thống khác làm gì để khắc phục vấn đề này. Dưới đây là các tùy chọn tôi biết:
- Sử dụng cơ chế bảo mật của SQL Server để duy trì danh sách người dùng và vai trò và làm cho ứng dụng máy tính để bàn thêm và xóa người dùng thông qua các truy vấn T-SQL.
- Thay vì kết nối trực tiếp với cơ sở dữ liệu, hãy tạo một số loại dịch vụ web chạy trên máy chủ và đặt logic xác thực vào đó. Thực hiện mọi yêu cầu xác thực bảo mật.
Các tùy chọn đầu tiên hơi xấu vì bạn tách người dùng khỏi cơ sở dữ liệu để người dùng không còn là thực thể hạng nhất và bạn không thể tham chiếu chúng với các mối quan hệ khóa ngoài, v.v.
Thứ hai có vẻ như là một vấn đề hiệu suất lớn và rất nhiều công việc phụ, cộng với việc bạn không thể dễ dàng sử dụng các trình ánh xạ ORM như NHibernate (tôi nghĩ).
Có ai có kinh nghiệm với điều này? Thực hành tốt nhất?
Biên tập
Suy nghĩ thêm một chút, SQL Server xác thực có thể giải quyết vấn đề này không? Ví dụ: nếu người dùng của bạn phải có thể chèn và cập nhật các bản ghi bảng thời gian để bạn có thể chỉnh sửa bảng thời gian của mình, thì không có cách nào máy chủ SQL có thể không cho phép truy cập vào các hàng khác trong bảng chi tiết bảng thời gian, nghĩa là bạn cũng có thể đọc và viết bảng thời gian của người khác .