Tôi muốn xác thực một tập hợp thông tin xác thực chống lại bộ điều khiển miền. ví dụ:
Username: STACKOVERFLOW\joel
Password: splotchy
Phương pháp 1. Truy vấn Active Directory với Mạo danh
Rất nhiều người đề nghị truy vấn Active Directory cho một cái gì đó. Nếu một ngoại lệ được đưa ra, thì bạn biết rằng thông tin xác thực không hợp lệ - như được đề xuất trong câu hỏi stackoverflow này .
Tuy nhiên, có một số nhược điểm nghiêm trọng đối với phương pháp này :
Bạn không chỉ xác thực tài khoản miền mà còn đang thực hiện kiểm tra ủy quyền ngầm. Có nghĩa là, bạn đang đọc các thuộc tính từ AD bằng cách sử dụng mã thông báo mạo danh. Điều gì sẽ xảy ra nếu tài khoản hợp lệ khác không có quyền đọc từ QUẢNG CÁO? Theo mặc định, tất cả người dùng đều có quyền truy cập đọc, nhưng các chính sách miền có thể được đặt để tắt quyền truy cập cho các tài khoản (và hoặc nhóm) bị hạn chế.
Ràng buộc với AD có một chi phí nghiêm trọng, bộ đệm ẩn lược đồ AD phải được tải tại máy khách (bộ đệm ADSI trong bộ cung cấp ADSI được DirectoryServices sử dụng). Đây là cả mạng và máy chủ AD, tiêu tốn tài nguyên - và quá đắt cho một hoạt động đơn giản như xác thực tài khoản người dùng.
Bạn đang dựa vào lỗi ngoại lệ cho một trường hợp không ngoại lệ và giả sử điều đó có nghĩa là tên người dùng và mật khẩu không hợp lệ. Các vấn đề khác (ví dụ: lỗi mạng, lỗi kết nối AD, lỗi cấp phát bộ nhớ, v.v.) sau đó được hiểu sai là lỗi xác thực.
Phương pháp 2. LogonUser Win32 API
Những người khác đã đề xuất sử dụng LogonUser()
hàm API. Điều này nghe có vẻ hay, nhưng thật không may, người dùng đang gọi điện đôi khi cần một quyền thường chỉ được cấp cho chính hệ điều hành:
Quá trình gọi LogonUser yêu cầu đặc quyền SE_TCB_NAME. Nếu quá trình gọi không có đặc quyền này, LogonUser không thành công và GetLastError trả về ERROR_PRIVILEGE_NOT_HELD.
Trong một số trường hợp, quá trình gọi LogonUser cũng phải bật đặc quyền SE_CHANGE_NOTIFY_NAME; nếu không, LogonUser không thành công và GetLastError trả về ERROR_ACCESS_DENIED. Đặc quyền này không bắt buộc đối với tài khoản hệ thống cục bộ hoặc các tài khoản là thành viên của nhóm quản trị viên. Theo mặc định, SE_CHANGE_NOTIFY_NAME được bật cho tất cả người dùng, nhưng một số quản trị viên có thể tắt nó cho tất cả mọi người.
Cung cấp đặc quyền " Hoạt động như một phần của hệ điều hành " không phải là điều bạn muốn làm - như Microsoft đã chỉ ra trong một bài báo cơ sở kiến thức :
... quá trình đang gọi LogonUser phải có đặc quyền SE_TCB_NAME (trong Trình quản lý người dùng, đây là quyền " Hoạt động như một phần của Hệ điều hành "). Đặc quyền SE_TCB_NAME rất mạnh mẽ và không nên được cấp cho bất kỳ người dùng tùy ý nào chỉ để họ có thể chạy ứng dụng cần xác thực thông tin đăng nhập.
Ngoài ra, một cuộc gọi đến LogonUser()
sẽ không thành công nếu một mật khẩu trống được chỉ định.
Cách thích hợp để xác thực một tập hợp thông tin xác thực tên miền là gì?
Tôi tình cờ gọi từ mã được quản lý, nhưng đây là một câu hỏi chung về Windows. Có thể giả định rằng khách hàng đã cài đặt .NET Framework 2.0.