2012-12-04 3 views
11

Ho un'applicazione ASP.NET 4.0 entro cui ho bisogno per inoltrare l'autenticazione al database. Ai fini di questa richiesta di assistenza, consente di chiamare il server Web "app1" e il server di database "sql1".Kerberos doppio hop in ASP.NET 4.0 e SQL2008R2

Il servizio di database SQL2008R2 è in esecuzione come istanza denominata "SQL2008R2" con un account di dominio personalizzato "SqlServer". Il server esegue Windows Server 2008 R2 Enterprise Edition. Ho creato uno SPN per questo ...

setspn -a MSSQLSvc/sql1.mydomain.local:SQL2008R2 SqlServer 

applicazione di ASP.NET è in esecuzione in un pool di applicazioni utilizzando un account di dominio personalizzato "WebApplicationUser", in modalità integrata Pipeline. Attualmente è in esecuzione sul mio portatile con Windows 7 Enterprise, ma alla fine sarà ospitato su Windows Server 2008 R2 Standard Edition. Ho creato 2 SPN di per l'applicazione (sulla macchina Windows 7 che sono attualmente in esecuzione da) ...

setspn -a http/app1 WebApplicationUser 
setspn -a http/app1.mydomain.local WebApplicationUser 

all'interno di Active Directory utenti e computer, ho selezionato l'account "WebApplicationUser" e ho abilitato la delega vincolata a "MSSQLSvc/sql1.mydomain.local: SQL2008R2" utilizzando qualsiasi protocollo (ho anche provato a utilizzare solo Kerbero).

L'applicazione è installata in IIS 7.5 e l'autenticazione è impostata per disabilitare Anonymouse, Basic, Digest e Forms pur abilitando "Impersonation ASP.NET" e "Windows". L'autenticazione di Windows ha "Protezione estesa" disattivata e "Autenticazione in modalità Kernel" abilitata. I provider sono "Negoziare" e "NTLM" in questo ordine.

L'applicazione ASP.NET utilizza EF, e la stringa di connessione è configurato per utilizzare la protezione integrata ...

<connectionStrings> 
    <add name="MyContext" 
      connectionString="metadata=res://*/Data.MyModel.csdl|res://*/Data.MyModel.ssdl|res://*/Data.MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=sql1.mydomain.local\sql2008r2;Initial Catalog=MyDatabase;Persist Security Info=false;Integrated Security=True;MultipleActiveResultSets=True&quot;" 
      providerName="System.Data.EntityClient" /> 
</connectionStrings> 

My Web di configurazione specifica sia l'autenticazione di Windows e la rappresentazione, dal momento che una pagine asincrone utilizzando, mi avere la politica inpersonation anche permesso che scorre ...

<runtime> 
    <alwaysFlowImpersonationPolicy enabled="true" /> 
</runtime> 

<system.web> 
    <authentication mode="Windows" /> 
    <identity impersonate="true" /> 
</system.web> 

Se ho accesso locale (su "web1") e selezionare l'applicazione (utilizzando IE), funziona tutto questo - ma questo non comporta il doppio hop Sto cercando di risolvere.

Se accedo a un'altra macchina e poi navigo all'applicazione usando IE, o navigo dal computer locale usando FireFox, questo non funziona - nota: FireFox mi richiede i dettagli di accesso. La connessione al database non riesce con "Accesso non riuscito per l'utente" NT AUTHORITY \ ANONYMOUS LOGON ""

A differenza di molti articoli (e qui potrebbe essere parte del problema), non sto utilizzando alcun codice personalizzato per impersonare l'utente. Sono a conoscenza del fatto che la rappresentazione verrà applicata trasversalmente all'applicazione dalle impostazioni web.config di cui sopra. Tutto quello che faccio è aprire la connessione e poi chiuderla di nuovo quando avrò finito.

Ovviamente ho perso un passaggio (o due), ma dopo aver esaminato tutta la documentazione che riesco a trovare (e ce ne sono stati molti), non riesco ancora a trovare che passo sia. Non aiuta il fatto che il 99% della documentazione che riesco a trovare sia effettivamente correlata a IIS6 e Windows 2003, ma i principi dovrebbero rimanere gli stessi.

Qualcuno ha suceeded a ottenere un tale configurazione per funzionare su Windows 7 e/o Windows Server 2008?

+0

Abilita registrazione eventi Kerberos sul server Web e database: http://support.microsoft.com/kb/262177?wa=wsignin1.0 Il visualizzatore eventi è la chiave per trovare e correggere gli errori Kerberos. – brian

+0

L'ho abilitato e ho scaricato anche lo strumento Network Monitor, ma non riesco ancora a vedere abbastanza informazioni per dirmi cosa c'è che non va. Immagino di non aver letto qualcosa correttamente, perché non ho dubbi sulla risposta. –

risposta

7
+0

Ho già visto un paio di questi, e ora ho provato il consiglio negli altri. Purtroppo ancora non riesco a farlo funzionare. –

+3

Il provider di autenticazione di Windows in IIS7 deve essere impostato su Negoziazione: Kerberos, non NTLM. Ciò significa che l'impostazione di autenticazione in modalità Kernel deve essere disabilitata. http://blog.reveille.org.uk/2010/01/asp-net-impersonation-delegation/ – Joe

+2

Joe; hai ragione - era il "Negoziare: Kerberos" che non è stato mostrato in nessuna altra documentazione che ho trovato - probabilmente perché AFAIK è nuovo per IIS7 + e tutta la documentazione è per IIS6. –

6

Quando si configurano gli SPN per SQL Server, abbiamo trovato che abbiamo bisogno di includere la porta su cui SQL Server l istens (1433).

È necessario scaricare e utilizzare lo strumento DelegConfig v2 di Brian Booth per configurare le impostazioni di configurazione corrette. http://blogs.iis.net/brian-murphy-booth/archive/2009/04/22/delegconfig-v2-beta.aspx

In pratica manterrà la tua mano per tutto il processo. Abbiamo trovato che lo strumento è inestimabile.

+0

Ho scaricato lo strumento. Mentre è molto buono, mi dice che la configurazione è corretta, ma quando poi provo un accesso di prova a una tabella all'interno del database ottengo lo stesso messaggio di accesso non riuscito. –

+1

Il mio consiglio è di sostituire SQL2008R2 con la porta 1433. 'setspn -a MSSQLSvc/sql1.mydomain.local: 1433 SqlServer' –

+0

John, anche tu eri corretto sul SPN; Avevo chiamato SPN di istanza, ma non appena li ho cancellati e creato un singolo SPN per host.fqdn: 1433 questo mi è stato d'aiuto. –