401 Client 'Verhandeln', Server 'Negotiate,NTLM" Beim Aufruf von WCF-Server zu Server
Ok, ich habe gelesen, jeder thread & Frage, die ich finden kann mit diesem Fehler und erstaunlicherweise noch keine Lösung gefunden habe. Ich versuche erfordern, um die Windows-Authentifizierung auf meinem IIS gehosteten WCF-Dienst (.NET 4.0), die, bis jetzt, hat bisher optional. Ich habe eine Windows-Authentifizierung aktiviert ist Endpunkt auf dem server verfügbar, für eine Weile mit mehreren remote-Anwendungen erfolgreich. Ich bin jetzt versuchen zu wechseln, unsere web-Anwendungen und an andere server-apps, die den WCF-Dienst über diesem gesicherten Endpunkt, indem Sie Ihnen die genau die gleiche client-Konfiguration, wie das arbeiten von remote-clients, sondern der server-apps erhalten ein 401 mit der Meldung:
The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate,NTLM'.]
Habe ich Anonyme und Windows-Authentifizierung aktiviert ist für den WCF-hosting-Website. Die web-Anwendung, mit der ich begonnen habe, mit gehostet wird, die auf einem anderen server als WCF-Dienst und läuft ASP.NET 2.0 und Windows Server 2008 R2 Enterprise. Ich habe beide erstellt ein client-Verhalten mit allowNtlm und legen Sie die Netzwerksicherheit: LAN Manager-Authentifizierungsebene auf Send LM & NTLM... auf der client-Seite. Auf dem Host-Ende, es ist Nur NTLMv2-Antworten Senden...ich weiß nicht, ob das beeinflusst, wie der server/Dienst übernimmt die Authentifizierung. Ich habe auch versucht die Einstellung allowedImpersonationLevel, um Identitätswechsel auf dem client, die, zum Glück, nicht funktioniert hat (weil Identitätswechsel sollte nicht nötig sein). Wir scheinen das gleiche Ergebnis zu erhalten für eine Windows-Dienst-und Konsolen-app, die auf dem gleichen server wie der web-app.
Hier ist meine server config:
<binding name="WindowsSecuredBinding">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
...
<service behaviorConfiguration="OMWebServices.QueueServiceBehavior"
name="OMWebServices.QueueService">
<endpoint address="" binding="basicHttpBinding" name="QueueEndpoint"
bindingName="" contract="OMWebServices.IQueueService" />
<endpoint binding="basicHttpBinding" bindingConfiguration="WindowsSecuredBinding"
name="QueueSecuredEndpoint" contract="OMWebServices.IQueueService" />
<endpoint address="mex" binding="mexHttpBinding" name="QueueMetadataEndpoint"
contract="IMetadataExchange" />
</service>
...
<behavior name="OMWebServices.QueueServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
Und hier die client config:
<endpoint address="https://.../QueueService.svc" binding="basicHttpBinding" bindingConfiguration="QueueSecuredEndpoint" behaviorConfiguration="OMServiceBehavior" contract="OMQueueService.IQueueService" name="QueueSecuredEndpoint" />
<binding name="QueueSecuredEndpoint" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
....
<!-- The behavior I tried that didn't make a difference -->
<behavior name="OMServiceBehavior">
<clientCredentials>
<windows allowedImpersonationLevel="Impersonation" allowNtlm="True"/>
</clientCredentials>
</behavior>
Meine erste Frage ist, was ist diese Fehlermeldung wirklich sagen mir? Es sagt dem client-Schema ist zu Verhandeln, und der server antwortet mit Negotiate,NTLM. Wenn der server bietet Verhandeln und und client Verhandeln, was ist das problem?
Zweite Frage ist natürlich, was ist falsch und wie mache ich das?
BEARBEITEN
Gut, das ist dumm. Das problem scheint zu sein, es werden keine Anmeldeinformationen übergeben werden. Weg zurück, wenn die web-site wurde in der Entwicklung, ich begann zu schreiben code, der explizit die Anmeldeinformationen im code, sondern in den Prozess, festgestellt, dass es bereits ohne das explizite setzen Sie. So, der code geblieben ist auskommentiert. Dies war unter IIS 6. Jetzt läuft auf IIS 7, es scheint nur zu funktionieren, wenn ich explizit festlegen der Anmeldeinformationen in meinem code. Bekomme ich automatisch über den w3wp-Prozess " Konto?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf die erste Frage, die Fehlermeldung sagt mir genau das, was es sagt; ich bin nicht autorisiert. Die Zeile sagt mir der client-Authentifizierungsschema und server-header ist nur zusätzliche info, keine Anzeichen für einen Konflikt. Es ist eigentlich die Bestätigung, dass die Konfiguration korrekt ist.
In der staging-Umgebung, das problem ist, maskiert wird, weil der WCF-Dienst und die web-Anwendung auf demselben server gehostet. Das problem ist die web app-Website konfiguriert ist, um das IUSR-Konto (oder IUSR_Server), ein lokales Konto für anonyme Benutzer standardmäßig. Dies ist der Benutzer, die übergeben wird (was ich glaube, ist gleich CredentialCache.DefaultNetworkCredentials). Wenn Sie sich auf unterschiedlichen Servern, WCF auf server 2, kann natürlich nicht einen server authentifizieren 1 Benutzer. Die Lösung ist in IIS mit der rechten klicken Sie auf Anonyme Authentifizierung > Bearbeiten...> check Application pool identity (ein domain-Konto in meinem Fall), oder geben Sie ein Domäne-Konto für Bestimmte Benutzer.
Bedeutet es nur, dass Ihr client und server mit verschiedenen Authentifizierungsschemas.
In Ihre client-Konfiguration, die Sie eingerichtet haben, ein
und eine Nachricht security
Also Sie könnten immer Fehler, weil dieser. Diese links könnten Ihnen helfen.
Auch, in Ihrem client-config -
Ändern Sie die Einstellung behaviorconfiguration von
behaviorConfiguration="OMSServiceBehavior"
zu
behaviorConfiguration="OMWebServices.QueueServiceBehavior"
Haben auch Sie versuchen, verwenden Sie
TransportCredentialOnly
? Wenn nicht, könnte es gut sein, zu versuchen, diese http://msdn.microsoft.com/en-us/library/ff648505.aspxTransport
undTransportCredentialsOnly.
Hier ist die link für seine Antwort.contract="OMQueueService.IQueueService"
solltecontract="OMWebServices.IQueueService"
Mein problem mit diesem Fehler war nicht config Verwandte, aber spezifisch für
einen WCF-Dienst ruft einen anderen auf der gleichen Maschine.
Weil diese betroffenen eine Flotte von neuen Servern, das teilweise bereitgestellt durch eine C# - Konsolenanwendung, ich löste es, indem Sie code ausführen, wie dies durch die betroffenen Server:
Neustart war nicht erforderlich auf Windows Server 2012.