2012-10-25 21 views
25

Sto creando un servizio pubblico sicuro (SSL) in cui le credenziali degli utenti risiedono in Active Directory. Voglio sfruttare l'autenticazione di ServiceStack e ho letto lo wiki article. Ho già scritto il codice per verificare le credenziali dell'utente con AD. Ho alcune domande.Come utilizzare l'autenticazione Servicestack con Active Directory/Autenticazione Windows?

  1. Quale provider di autenticazione utilizzo? Credenziali, autenticazione di base o personalizzata? Il servizio richiede SSL, quindi l'autenticazione di base sarebbe sicura, tuttavia le password sarebbero crittografate per maggiore sicurezza.
  2. Devo ancora memorizzare UserAuth e memorizzare AuthUserSession?
  3. Il client monotouch supporta l'autenticazione?

Aggiornamento 2: ho concluso un servizio SS di test integrato con AD, utilizzando CredentialsAuthProvider. Comunque il mio obiettivo finale è avere 1 sito che sia un API quando viene chiamato dai client. Quindi fondamentalmente un sito MV MVC.

Aggiornamento:

È la mia comprensione dopo aver fatto qualche ricerca più che SS sta considerando di fare un prodotto commerciale che può supportare l'autenticazione di Windows in futuro. Ho letto questo in un commento di mythz sul gruppo SS Google. Il motivo per cui ho posto questa domanda su SO è che la mia azienda costruisce applicazioni interne usando IWA e l'adozione di SS MVC è difficile senza IWA. Penso di aver letto che potresti ospitare il sito SS MVC da un sito ASP.NET che usa IWA ma non l'ho ancora provato.

+0

Ho parlato con Demis Bellot su Twitter e ho ottenuto una risposta simile. '@ChaseFlorell Non qualcosa che ho investigato, non lavoro più su Win/Active Directory. Richiede un po 'di ricerca e sviluppo per trovare/risolvere il problema' ... Dovresti scrivere quello che ha detto come risposta sotto. –

risposta

5

Ho anche collegato ServiceStack con l'autenticazione integrata di Windows (per un'applicazione aziendale), e la chiave è stata saltare cercando di integrarlo con AuthProviders di ServiceStack del tutto, dal momento che l'approccio generale dell'IWA non tratta con le credenziali nel codice dell'applicazione - è gestito dal server web. Quello che ho fatto è stato:

  1. configurare il sito/applicazione in IIS in modo che l'autenticazione di Windows era l'unica opzione attivata. (Non è consentito l'accesso anonimo.) Ciò significa che IIS stesso si prenderà cura della sequenza challenge-response (HTTP 401/200) con utenti non autenticati e gestirà la parte di autenticazione del processo.

  2. Implementare ServiceStack IHasRequestFilter (un filtro di richiesta preliminare HTTP) come un attributo (ad esempio, [AdminOnly]). Il metodo RequestFilter di questo filtro recupera il nome utente corrente da HttpContext (HttpContext.User.Identity.Name), lo cerca da un repository (che potrebbe essere un database SQL, file flat, ecc.), Memorizza i risultati utilizzando lo ICacheClient di ServiceStack (cache di memoria, Redis, ecc.), e genera 403 HttpError se non autorizzato.

Con questo fatto, tutto ciò che era necessario era quello di aggiungere l'attributo di classi o metodi in cui desiderato (che ottiene questa autenticazione/autorizzazione nella pipeline servizio dove desiderato), e registrare il mio fornitore di cache desiderato nel mio AppHost implementazione, ad es .:

container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false }); 

Funziona magnificamente.

+0

Grazie per la risposta. Darò una prova. – BrandonG

5

Ecco cosa ha detto Demis Bellot su twitter. Probabilmente possibile ma necessita di ulteriori ricerche.

Non qualcosa che ho studiato, non funziona più nella directory Win/Active . Richiede un po 'di R & D per trovare/risolvere il problema

alla fine ho ottenuto un servizio di prototipo funzionante con AD. Ho implementato CredentialsAuthProvider. Ora questo non è legato ad ASP.NET IWA, ma controlla facilmente se l'utente è in AD. Speriamo che questo possa aiutare qualcuno.

public class LDAPAuthProvider : CredentialsAuthProvider 
{ 
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
        { 
         //Check to see if the username/password combo is valid, an exception will be thrown if the username or password is wrong 
         try 
         { 
          DirectoryEntry entry = new DirectoryEntry(ConfigurationManager.AppSettings["TargetOU"], userName, password); 
          object nativeObject = entry.NativeObject; 
         } 
         catch (Exception) 
         { 
          //This means the username/password combo failed 
          return false; 
         } 

         return true; 
        } 
} 
+0

Vorrei aggiungere quante più informazioni possibili a questa risposta. Includi alcune informazioni dai tuoi "aggiornamenti" qui sopra, e magari qualche codice su come hai usato 'CredentialsAuthProvider'. –

+0

Penso che un buon compromesso sarebbe utilizzare l'autenticazione basata su form. IWA era facile da configurare e non richiedeva alcuna configurazione per l'utente, ma con le versioni più recenti di IE, è necessario aggiungere il sito ai siti attendibili e quindi modificare la sicurezza per consentire il passaggio delle credenziali dell'utente. È possibile implementare l'autenticazione basata su moduli e, se un cliente visita l'URL, è possibile autenticare le proprie credenziali e salvare il cookie utilizzando FormsAuthentication.SetAuthCookie(). – BrandonG

+0

Questa domanda SO sarebbe di grande aiuto: http://stackoverflow.com/questions/15068774/use-asp-net-authentication-with-servicestack – BrandonG

Problemi correlati