2010-02-12 24 views
46

Ho un'applicazione Intranet (ASP.NET 3.5) che è stata progettata per utilizzare l'autenticazione moduli (insieme al sistema di appartenenza aspnet predefinito). Conservo anche informazioni aggiuntive sugli utenti in un'altra tabella che condivide la sua chiave primaria con la tabella aspnet_users.Autenticazione moduli Forming con autenticazione Windows

Per gli utenti che fanno parte del nostro dominio, memorizzo il nome dell'account di dominio nella tabella degli utenti secondari e desidero accedere automaticamente agli utenti il ​​cui nome account di dominio corrisponde a un nome memorizzato nella tabella.

Ho letto le guide che sono disponibili - sono tutte risalenti a due anni fa o più e si assume che sia possibile attivare l'autenticazione di Windows in una pagina di accesso separata che consente di estrarre il nome dell'account di dominio. Da quello che posso dire, però, questo non è possibile in IIS7 (il metodo di autenticazione generale è applicato su tutte le pagine e non può essere disattivato in modo selettivo, ed entrambi i metodi di autenticazione non possono essere applicati sulla stessa pagina).

Esiste un modo per consentire a IIS di passare attraverso il nome dell'account di dominio Windows dell'utente richiedente? Non ho bisogno dell'autenticazione AD corretta, solo il nome del dominio.

risposta

45

In realtà, si può fare. Un po 'tardi per @dr_draik, ma questo mi è sembrato un risultato su google, quindi ho pensato di condividere alcune conoscenze.

Se sei in modalità classica, attiva sia l'autenticazione di Windows sia quella di Form. Riceverai un avvertimento per non essere in grado di eseguire entrambi contemporaneamente, ma puoi fare ignore it. Quindi, è possibile spelunk intorno varie proprietà come Codice:

HttpContext.Current.Request.ServerVariables["LOGON_USER"]

e pescare il nome utente fuori di lì.

Se sei in modalità integrata - 4021905 IIS7 Challenge-based and login redirect-based authentication cannot be used simultaneiously porta a IIS 7.0 Two-Level Authentication with Forms Authentication and Windows Authentication che è un modulo che consente di modificare selettivamente l'autorizzazione per pagine diverse.

+0

Molto interessante - grazie per averlo aggiunto qui, poiché ritengo che ci siano molti risultati di ricerca su questo argomento. –

+0

Cambia risposta accettata poiché evidentemente questa domanda sta ottenendo parecchi colpi, e sarà più chiara in questo modo. –

+0

Dolce, ta! Spero che aiuti i futuri googlers –

0

Ho qualcosa da provare, non so se funzionerà.

In passato abbiamo utilizzato Request.ServerVariables ["LOGON_USER"] ma ovviamente per questo per restituire un valore non vuoto è necessario disabilitare l'accesso anonimo.

veda questo articolo: http://support.microsoft.com/default.aspx/kb/306359

Suggerisce mantenere l'accesso anonimo sul lato IIS, e le forme di autenticazione, ma negando l'utente anonimo come segue:

<authorization> <deny users = "?" /> <!-- This denies access to the Anonymous user --> <allow users ="*" /> <!-- This allows access to all users --> </authorization>

Non sono sicuro se questo funzionerà ma vale la pena provare.

-Krip

+1

Grazie - ha fatto un tentativo ma è ancora una stringa vuota anche con le impostazioni come raccomandato. Ho controllato l'articolo e non si applica a IIS7, sfortunatamente. –

0

Purtroppo, ciò che si sta cercando di fare proprio non è supportato. Affinché ASP.NET conosca il nome utente di Windows, è necessario utilizzare l'autenticazione di Windows.

È possibile impostare un altro sito/directory virtuale che ha appena inoltrato le informazioni sul nome utente a un'altra pagina. Ma cosa succede quando gli utenti autenticati da Windows tentano di accedere?

+1

Grazie, la soluzione per le due applicazioni sembra la più praticabile, ma penso che dovremo solo andare con auth delle form. Sembra piuttosto maldestro avere un'app separata solo per il login. –

4

È possibile impostare sempre 2 applicazioni separate in IIS7. Uno avrebbe abilitato l'autenticazione di Windows. L'altra sarebbe l'app principale con l'autenticazione dei moduli. Se un utente accede all'app di autenticazione di Windows, la pagina può acquisire le proprie credenziali e passarla all'app di autenticazione dei moduli.

+1

Grazie, la soluzione per le due applicazioni sembra la più praticabile, ma penso che dovremo solo andare con auth delle form. Sembra piuttosto maldestro avere un'app separata solo per il login. –

4

(più per completezza di informazione realmente)

ho chiesto ad un ragazzo di sicurezza Net a questa domanda in una conferenza un po 'indietro. La sua risposta è stata che era possibile tecnicamente, ma non l'aveva mai visto fare (e fargli sapere se l'ho fatto e ha funzionato!).

Ha suggerito il modo in cui potrebbe essere fatto creando il proprio filtro ISAPI e installandolo in IIS. Il filtro ISAPI intercettava le richieste e fondamentalmente eseguiva il lavoro che IIS esegue quando utilizza l'autenticazione integrata, ma ricade all'utilizzo di moduli se questo non era presente. Ciò comportava alcune complicate logiche di challenge/response nel filtro.Questo era per IIS6, quindi potrebbe essere diverso in IIS7.

Anche se questo potrebbe essere tecnicamente possibile, non vorrei suggerire questo percorso come ci si sente come un po 'di un hack, e rotolando la propria sicurezza non è mai una buona idea (a meno che non davvero sa cosa si sta facendo).

+1

Grazie per l'input - è un po 'fastidioso che questo non sia più possibile (o praticamente non sia più possibile) ma suppongo che sia il prezzo del progresso. –

+0

Grazie per aver condiviso queste informazioni! Sono d'accordo con quello che hai detto di non tirare la nostra caratteristica di sicurezza a meno che non siamo abbastanza sicuri, –

1

Ci sono molti articoli sul mixaggio dell'autenticazione impostando config per utilizzare i moduli con l'accesso anonimo all'app. In secondo luogo, una pagina per l'autenticazione integrata dovrebbe essere creata con le impostazioni di IIS impostate per negare l'anonimato e utilizzare l'autenticazione integrata. Lì si tratterà del trucco magico controllando la variabile "Logon_User" della collezione ServerVariables del requets. Infine, per l'autenticazione integrata per l'accesso invisibile all'utente deve avere un nome host breve. Quindi, se il tuo pezzo di autenticazione dei moduli è esposto a Internet tramite FQDN, dovrebbe esserci una sorta di reindirizzamento alla pagina dell'host breve. Penso che sia possibile ottenere con una sola applicazione in IIS con 2 directory virtuali.

+1

per quanto ne so, questa soluzione funziona su IIS6, ma non in IIS7.questo perché in IIS6 è possibile assegnare la modalità di autenticazione su una base per cartella (anche per file), mentre su IIS7 le impostazioni di autenticazione sono globali per l'intera applicazione. – pomarc

1

Ho trovato una soluzione senza particolari componenti aggiuntivi. È stato complicato e coinvolto nel mettere insieme elementi da tutte le pagine di riferimento qui. L'ho pubblicato al riguardo: http://low-bandwidth.blogspot.com.au/2014/11/iis7-mixed-windows-and-forms.html

In sostanza, è necessario abilitare i moduli, le finestre e l'autenticazione anon. La schermata di accesso deve essere basata su moduli e contenere un pulsante per attivare l'accesso a Windows, che emette una risposta di risposta HTTP 401 che, in caso di successo, crea un ticket di accesso basato su moduli.

Le questioni sono piuttosto complesse e il post passa attraverso i principi e la soluzione in dettaglio.

Problemi correlati