2013-02-18 16 views
28

Ho difficoltà a chiamare un servizio Web da un'applicazione Web e speravo che qualcuno qui potesse essere in grado di aiutare. Da quello che posso dire, questo sembra che abbia qualcosa a che fare con il Kerberos double-hop issue. Tuttavia, se lo è, non sono sicuro di cosa fare per risolvere il problema. Per rendere le cose più difficili, non ho le autorizzazioni appropriate per apportare modifiche agli account di Active Directory, quindi ho bisogno di sapere cosa chiedere quando richiedi le modifiche. Nella mia situazione, ho bisogno di passare le credenziali (Autenticazione integrata di Windows) da un'applicazione web a un servizio Web di back-end in modo che il servizio Web venga eseguito nel contesto appropriato dell'utente.Come posso risolvere il problema del doppio hop di Kerberos?

Ecco il mio problema esatto:

questo funziona

Working scenario

Questo non funziona

Non-working scenario

L'unica differenza tra lo scenario di lavoro e lo scenario non funzionante è che lo scenario di lavoro sta eseguendo l'applicazione su localhost (sia sul PC di uno sviluppatore che sul server in questione) e l'esempio non funzionante è in esecuzione su un altro computer. Il codice tra entrambi gli scenari è esattamente lo stesso.

Quello che ho provato

  1. Aggiunta di uno SPN per l'account di dominio che esegue il pool di app per ogni server setspn -a http/server1 DOMAIN\account
  2. Diversi metodi di rappresentazione
  3. Rimozione del codice di rappresentazione e l'esecuzione di using(...) la chiamata al servizio web come account del pool di app. Funziona come previsto.

Qualcuno ha qualche idea su cosa potrei essere in grado di fare per risolvere questo problema?

+3

I diagrammi freddi rendono la domanda molto più facile da capire - grazie! –

risposta

12

Il server intermedio deve essere attendibile per la delega. In caso contrario, nessuna credenziale verrà delegata e il server intermedio non potrà impersonare il client originale.

+1

Questo è finito per essere la soluzione nell'ambiente che ho descritto sopra. Tuttavia, ci siamo imbattuti (e ci stiamo ancora imbattendo) nello stesso problema nel nostro ambiente di produzione ora che viene utilizzato NLB. Sto lavorando al problema ora, ma ho bisogno di creare un ambiente di test che simuli il nostro ambiente di produzione al fine di individuare la causa esatta. Qualche possibilità che tu sappia cosa fare in quel caso?L'aggiunta di un SPN all'account di dominio su cui sono in esecuzione tutti i servizi con il nome cluster e il nome di dominio completo ha interrotto l'autenticazione. –

+0

Non è possibile mappare un SPN a più account. Tutti gli SPN devono essere distinti in tutta la foresta. Poiché sei dietro un bilanciatore del carico, puoi provare quanto segue: 1. inoltrare DNS al dominio NLB, invertire DNS ai server attuali. 2. Utilizzare l'NLB in combinazione con DNS round-robin. Questo funziona di sicuro. –

+0

Forse ho spiegato le cose in modo errato a causa della mia conoscenza limitata dello spazio del problema. Quello che inizialmente ho provato a fare (che ha rotto tutto) è stato quello di eseguire i seguenti comandi: setpn -A http/servername DOMAIN \ webaccount setspn -A http/servername.FQDN DOMAIN \ webaccount –

3

Il più delle volte il motivo è che il server 1 non passa un token di delega al server 2. Quindi, quando il server 2 tenta di utilizzare quel ticket di autenticazione per andare altrove (probabilmente un server SQL) non riesce.

È necessario impostare il livello di rappresentazione per il WCF chiamata

ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation 

http://msdn.microsoft.com/en-us/library/system.servicemodel.security.windowsclientcredential.allowedimpersonationlevel.aspx

Problemi correlati