2012-02-01 34 views
5

Mam aplikację .NET (połączenie C# i VB.NET), w której chciałbym wyświetlić okno dialogowe logowania do systemu Windows (lub moje własne okno dialogowe) i uwierzytelnić użytkownika przy użyciu uwierzytelniania systemu Windows. Na każde wymaganie muszę poprosić użytkownika, aby uwierzytelnił się po CO NAJMNIEJ minutę bezczynności. Wolałbym .NET natywny sposób wykonywania uwierzytelniania Windows, ale zainteresowany innymi sposobami ...Uwierzytelnianie Windows w .NET

Odpowiedz

10

do uwierzytelnienia użytkownika, można użyć metody ValidateCredential z PrincipalContext. Pamiętaj, aby dodać odniesienie 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 
} 

Jeśli nie walidacji przeciwko domenie, sprawdź inne ContextType. Możesz także użyć innej opcji do sprawdzenia poświadczeń (ContextOptions).

+0

Chociaż brzmi to jak najlepszy sposób na zrobienie tego - po prostu okazało się, że te klasy nie są dostępne dla .NET 2.0. – Denis

2

Znaleziono następujące elementy i doszedłem do wniosku, że dodam je do skończenia. Nadal lubię odpowiedź Gabriela!

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

Dlaczego używałbyś niezarządzanego kodu, kiedy możesz zrobić wszystko przy pomocy zarządzanego kodu? –

+2

Ponieważ kod zarządzany nie jest dostępny w programie .NET Framework 2.0 – Denis

Powiązane problemy