2012-02-01 13 views
5

Tengo una aplicación .NET (combinación de C# y VB.NET) en la que me gustaría mostrar un cuadro de diálogo de inicio de sesión de Windows (o mi propio cuadro de diálogo) y autenticar al usuario utilizando la Autenticación de Windows. Según el requisito, tengo que pedirle al usuario que se autentique después de AL MENOS un minuto de estar inactivo. Preferiría una forma .NET nativa de hacer Autenticación de Windows, pero estoy interesado en otras formas ...Autenticación de Windows en .NET

Respuesta

10

para autenticar a un usuario, puede usar el método ValidateCredential del PrincipalContext. Asegúrese de agregar la referencia 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 
} 

Si usted no está validando contra un dominio, Consulta otras ContextType. También puede usar otra opción para validar las credenciales (ContextOptions).

+0

Aunque esto suena como la mejor manera de hacerlo, acaba de descubrir que estas clases no están disponibles para .NET 2.0. – Denis

2

Encontré lo siguiente y pensé que lo agregaría para completarlo. ¡Todavía me gusta la respuesta de 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

¿Por qué usar código no administrado cuando puede hacer todo con código administrado? –

+2

Porque el código administrado no está disponible en .NET framework 2.0 – Denis

Cuestiones relacionadas