2012-02-01 30 views
5

Tôi có một ứng dụng .NET (kết hợp của C# và VB.NET) nơi tôi muốn hiển thị hộp thoại Windows Login (hoặc hộp thoại của riêng tôi) và xác thực người dùng bằng Windows Authentication. Theo yêu cầu, tôi cần yêu cầu người dùng xác thực sau AT LEAST một phút không hoạt động. Tôi muốn có một cách tự nhiên .NET để thực hiện Xác thực Windows nhưng quan tâm đến các cách khác ...Xác thực Windows trong .NET

Trả lời

10

để xác thực người dùng, bạn có thể sử dụng phương thức ValidateCredential của PrincipalContext. Đảm bảo thêm tham chiếu System.DirectoryServices.AccountManagement.

//If you are validating on a domain 
PrincipalContext pcon = new PrincipalContext(ContextType.Domain);  
if(pcon.ValidateCredential(txtUsername.Text, 
          txtPassword.Text, 
          ContextOptions.Negotiate)) 
{ 
    //User is authenticated 
} 

Nếu bạn không xác nhận chống lại một tên miền, kiểm tra ContextType khác. Bạn cũng có thể sử dụng tùy chọn khác để xác thực thông tin xác thực (số ContextOptions).

+0

Mặc dù điều này nghe giống như cách tốt nhất để làm điều đó - chỉ phát hiện ra các lớp này không có sẵn cho .NET 2.0. – Denis

2

Tìm thấy thông tin sau và tôi đã thêm nó để hoàn thành. Tôi vẫn thích câu trả lời của Gabriel!

Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As LogonType, ByVal dwLogonProvider As Integer, ByRef phToken As IntPtr) As Integer 
Private Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean 

    Public Enum LogonType As Integer 
     LOGON32_LOGON_INTERACTIVE = 2 
     LOGON32_LOGON_NETWORK = 3 
     LOGON32_LOGON_BATCH = 4 
     LOGON32_LOGON_SERVICE = 5 
     LOGON32_LOGON_UNLOCK = 7 
     LOGON32_LOGON_NETWORK_CLEARTEXT = 8 
     LOGON32_LOGON_NEW_CREDENTIALS = 9 
    End Enum 

    Public Function IsAuthenticated(ByVal Username As String, ByVal Password As String, Optional ByVal Domain As String = "") As Boolean 
     Dim Token As New IntPtr 
     LogonUser(Username, Domain, Password, LogonType.LOGON32_LOGON_INTERACTIVE, 0, Token) 
     CloseHandle(Token) 
     If Token.ToInt32 <> 0 Then Return True 
    End Function 
+0

Tại sao bạn sử dụng mã không được quản lý khi bạn có thể thực hiện mọi thứ với mã được quản lý? –

+2

Vì mã được quản lý không có trong .NET framework 2.0 – Denis

Các vấn đề liên quan