2012-06-28 65 views
13

Sto provando a sviluppare un semplice servizio Web per autenticare gli utenti di un'applicazione desktop utilizzando il framework di identità di Windows, al momento sto passando il token generato da WindowsIdentity.GetCurrent().Token tramite una variabile di post (è crittografato e ssl'd , L'autenticazione di Windows non è un'opzione dato il layout dei nostri domini e la configurazione del server). Sto passando il token indietro bene e convertendolo di nuovo in un IntPtr.Convalida il token di identità di Windows

Non riesco a verificare come convalidare il token per garantire che sia stato generato da una particolare Active Directory (o qualsiasi altra cosa). Ho provato a creare una nuova istanza WindowsIdentity, dato il token, ma che risulta solo in un'eccezione (messaggio: Token non valido per la rappresentazione - non può essere duplicato).

Se qualcuno può fornire aiuto o suggerimenti, lo apprezzerei molto, grazie in anticipo.

+0

Sarebbe possibile utilizzare il token e lasciare la convalida a Windows quando si utilizza il token per accedere a una risorsa? –

+2

Nel mio caso sto usando una soluzione client/server socket personalizzata in cui voglio autenticare gli utenti usando l'autenticazione di Windows. Quindi ho bisogno di trasportare un token o simile al server per l'autenticazione, ma non capisco come. MSDN non è molto utile. – jgauffin

+0

Il client e il server si trovano sullo stesso dominio? Il client si autentica sul dominio durante l'accesso a Windows? –

risposta

-1

Beh,

Se ho capito bene la tua domanda, so che è possibile farlo fare chiamate API diretti. Il LogonUser nel advapi32.dll è la risposta. Il seguente frammento ha funzionato per me

public class ActiveDirectoryHelper 
{ 
    [DllImport("advapi32.dll", SetLastError = true)] 
    private static extern bool LogonUser(
     string lpszUsername, 
     string lpszDomain, 
     string lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     out IntPtr phToken 
     ); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool CloseHandle(IntPtr hObject); 

    public static bool Authenticate(string userName, string password, string domain) 
    { 
     IntPtr token; 
     LogonUser(userName, domain, password, 2, 0, out token); 

     bool isAuthenticated = token != IntPtr.Zero; 

     CloseHandle(token); 

     return isAuthenticated; 
    } 

    public static IntPtr GetAuthenticationHandle(string userName, string password, string domain) 
    { 
     IntPtr token; 
     LogonUser(userName, domain, password, 2, 0, out token); 
     return token; 
    } 


} 
1
public bool DoesUserExist(string userName) 
{ 
    using (var domainContext = new PrincipalContext(ContextType.Domain, "DOMAIN")) 
    { 
     using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName)) 
     { 
      return foundUser != null; 
     } 
    } 
} 

Per ottenere il controllo di se un utente esiste. Questo deriva dallo spazio dei nomi System.DirectoryServices.AccountManagement e dall'assemblaggio.

Basta inserire il tuo nome utente che è possibile ottenere da WindowsIdentity.GetCurrent() e questo restituirà un vero/falso se un utente se nel tuo gruppo di utenti. (sostituisci DOMAIN con il nome del tuo gruppo desiderato.)

Problemi correlati