Śledziłem wiele artykułów msdn i wskazówki codeplex, ale nie mogę uzyskać WCF do pracy z uwierzytelnianiem i delegowaniem Kerberos i doceniłbym małą pomoc.Uwierzytelnianie WCF i Kerberos
Konfiguracja
Mam usług WCF w witrynie IIS na komputerze zdalnym
- IIS 6.0 w systemie Windows 2003 R2 - SP 2
- SPN dla maszyny został dodany (http/myserver & & http/myserver: 8080)
- Konto AD zostało utworzone dla puli aplikacji IIS
- Konto AD ma ustawienia pozwalają na delegację (Kerberos), ustawiony na true
używam Brian Booth's debug site na 8080 a strona przechodzi wszystkie wymagania dotyczące delegowania Kerberos. W debugującej witrynie IIS wyłączono anonimowe uwierzytelnianie i włączone jest uwierzytelnianie systemu Windows.
Udostępniłem dublowanie tych ustawień do witryny obsługującej usługę 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 - Metoda Web
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string GetCurrentUserName()
{
string name = WindowsIdentity.GetCurrent().Name;
return name;
}
Klient 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
następujący błąd występuje, gdy moja aplikacja testy, aplikacja WinForms, próbuje wywołać metodę WWW:
„Żądanie HTTP jest nieautoryzowany ze klienckiego systemu uwierzytelniania 'Anonymous' . Nagłówek uwierzytelniania otrzymanych od serwera było 'Negocjuj, NTLM' „
dziennik zdarzeń
następujący błąd w dzienniku zdarzeń.
Wyjątek: Systemu .ServiceModel.ServiceActivationException: Usługa "/Service.svc" nie może być aktywowana z powodu wyjątku podczas kompilacji tację. Komunikat wyjątku to: Ustawienia zabezpieczeń dla tej usługi wymagają uwierzytelnienia "Anonimowy", ale nie jest włączone dla aplikacji IIS , która jest hostem tej usługi.
Którego nie rozumiem. Cały punkt tej usługi polega na tym, aby nie zezwalać na anonimowe uwierzytelnianie, każdy użytkownik/żądanie musi być uwierzytelniany przy użyciu biletów Kerberos, a następnie przekazywać je na inne komputery.
Jak skonfigurować tę usługę WCF do uwierzytelniania i delegowania Kerberos?
Przegląd 1
Po przeczytaniu this SO question I usunięte końcowego metadane. To nie rozwiązało problemu.
Revision 2
Po więcej badania znalazłem kilka postów sugerujących zmianę wsHttpBinding do basicHttpBinding. Modyfikacja tej części pliku web.config została zamieszczona poniżej, a punkt końcowy usługi został zaktualizowany w celu odwołania się do tego powiązania. Usługa
WWW - Web Config (poprawiona)
<basicHttpBinding>
<binding name="basicBindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
</security>
</binding>
</basicHttpBinding>
Klient App - App Config (poprawiona)
<!-- ... -->
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
<message clientCredentialType="UserName"
algorithmSuite="Default" />
</security>
<!-- ... -->
Error (Revised)
Prąd Błąd wygląda tak, jakby zawierał autograf Kerberos nagłówek ntication.
Żądanie HTTP jest nieautoryzowany ze schematu uwierzytelniania klienta 'Negocjuj'. Nagłówek uwierzytelniania otrzymanych od serwera było „Negocjuj SOMEHUGESCARYKEYHERE
Uwaga, opublikowałem i usunąłem coś podobnego wczoraj, ten wpis zawiera poprawki oparte na większej ilości badań i powinien być czytelniejszy. – blu
Dodałem zmienioną konfigurację aplikacji na podstawie opinii marc_s. – blu