Ho seguito numerosi articoli msdn e la guida di codeplex ma non riesco a far funzionare WCF con l'autenticazione Kerberos e la delega e apprezzerei un piccolo aiuto.Autenticazione WCF e Kerberos
Setup
Ho il servizio WCF in un sito Web IIS su una macchina remota
- IIS 6.0 su Windows 2003 R2 - SP 2
- L'SPN per la macchina è stata aggiunta (http/myserver & & http/myserver: 8080)
- Un account AD è stato creato per il pool di applicazioni IIS
- L'account AD ha l'impostazione, consentire la delega (per Kerberos), impostata su true
Sto usando Brian Booth's debug site sul 8080 e il sito ha superato tutti i requisiti per la delega Kerberos. Il sito di debug di IIS ha l'autenticazione anonima disattivata e l'autenticazione integrata di Windows attiva.
Ho effettuato il mirroring di queste impostazioni sul sito che ospita il servizio WCF.
Web Service - Web Config (Original)
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WsHttpBindingConfig">
<security>
<message negotiateServiceCredential="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Service">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="WsHttpBindingConfig"
contract="IService">
<identity>
<servicePrincipalName value="http/myserver" />
<dns value="" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceAuthorization
impersonateCallerForAllOperations="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Web Service - Metodo Web
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string GetCurrentUserName()
{
string name = WindowsIdentity.GetCurrent().Name;
return name;
}
client App - App Config
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService"
... />
...
<security mode="Message">
<transport clientCredentialType="Windows"
proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows"
negotiateServiceCredential="true"
algorithmSuite="Default"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://myserver/Service.svc"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService"
contract="KerberosService.IService"
name="WSHttpBinding_IService">
<identity>
<servicePrincipalName value="http/myserver" />
</identity>
</endpoint>
</client>
</system.serviceModel>
Application Error
Il seguente errore si verifica quando la mia applicazione di test, un'applicazione WinForms, tenta di chiamare il metodo web:
"La richiesta HTTP non è autorizzato con cliente schema di autenticazione 'Anonymous' . L'intestazione di autenticazione ricevuto dal server è stato 'Negotiate, NTLM' "
Registro eventi
Il seguente errore è nel registro eventi:.
Eccezione: sistema .ServiceModel.ServiceActivationException: Il servizio '/Service.svc' non può essere attivato a causa di un'eccezione durante compila zione. Il messaggio di eccezione è: le impostazioni di sicurezza per questo servizio richiedono l'autenticazione "anonima" ma non è abilitato per l'applicazione IIS che ospita questo servizio.
Che non capisco. L'intero punto di questo servizio è quello di non consentire l'autenticazione anonima, ogni utente/richiesta deve essere autenticato utilizzando i ticket Kerberos, quindi passandoli attraverso altre macchine.
Come devo configurare questo servizio WCF per l'autenticazione e la delega Kerberos?
Revisione 1
Dopo aver letto this SO question ho rimosso l'endpoint metadati. Questo non ha risolto il problema.
Revisione 2
Dopo più ricercando ho trovato alcuni post che suggeriscono di cambiare wsHttpBinding a basicHttpBinding. La modifica a quella parte di web.config è stata inclusa di seguito e l'endpoint del servizio è stato aggiornato per fare riferimento a tale associazione.
Web Service - Web Config (riveduta) App
<basicHttpBinding>
<binding name="basicBindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
</security>
</binding>
</basicHttpBinding>
cliente - App Config (Revised)
<!-- ... -->
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
<message clientCredentialType="UserName"
algorithmSuite="Default" />
</security>
<!-- ... -->
Error (riveduta)
L'attuale l'errore sembra che contenga un Kerberos authe intestazione
La richiesta HTTP non è autorizzato con schema di autenticazione del client 'Negoziare'. L'intestazione di autenticazione ricevuto dal server è stato 'Negoziare SOMEHUGESCARYKEYHERE
Nota, ho postato e cancellato qualcosa di simile ieri, questo post include revisioni basate su ulteriori ricerche e dovrebbe essere più pulito da leggere. – blu
Ho aggiunto la configurazione dell'app modificata in base al feedback di marc_s. – blu