2015-08-11 16 views
15

Wir haben eine WPF-Anwendung mit C# entwickelt haben und verwenden RestSharp mit einem einfachen Web-Service wie folgt zu kommunizieren:401 beim Aufruf von Web-Service nur auf bestimmten Maschinen

Client = new RestClient(serviceUri.AbsoluteUri); 
Client.Authenticator = new NtlmAuthenticator(SvcUserName, SvcPassword.GetString()); 

Alles hat super geklappt, bis wir Anrufe erhalten, dass Auf einigen Computern (die meisten funktionieren) kann die App keine Verbindung zum Dienst herstellen. Ein direkter Aufruf an die Service-Methode mit Fiddler funktioniert. Dann extrahierten wir eine kleine .net-Konsolen-App und probierten den Service-Aufruf mit RestSharp und direkt mit einem HttpWebRequest und es scheiterte wieder mit 401. Nun haben wir System.Net-Tracing aktiviert und etwas bemerkt. Nach den ersten 401, was normal ist, erzeugt die fehlerhafte Maschine dieses Protokoll:

System.Net Information: 0: [4480] Verbindung # 3741682 - Empfangene Header { Connection: Keep-Alive- Content-Length : 1293 Content-Type: text/html Datum: Mo, 10. August 2015 00.37.49 GMT Server: Microsoft-IIS/8.0 WWW-Authenticate: Negotiate, NTLM X-Powered-By: ASP.NET }. System.Net Informationen: 0: [4480] ConnectStream # 39451090 :: ConnectStream (gepuffert 1293 Bytes.) System.Net Information: 0: [4480] Verknüpfung von HttpWebRequest # 2383799 mit ConnectStream # 39451090 System.Net Information: 0: [4480] Verknüpfen von HttpWebRequest # 2383799 mit HttpWebResponse # 19515494 System.Net Information: 0: [4480] Auflisten von Sicherheitspaketen: System.Net Information: 0: [4480] Aushandeln System.Net Information: 0: [4480] NegoExtender System.Net Informationen: 0: [4480] Kerberos System.Net Informationen: 0: [4480] NTLM System.Net Informationen: 0: [4480] Schannel System.Net Information: 0: [4480] Microsoft Unified Security Protokollanbieter System.Net Information: 0: [4480] WDigest System.Net Information: 0: [4480] TSSSP System.Net Information: 0: [4480] pku2u System.Net Information: 0: [4480] CredSSP

System.Net Information: 0: [4480] AcquireCredentialsHandle (package = NTLM, Vorsatz = Outbound, authdata = (String.Empty) \ corp \ svc_account)

System.Net Information: 0 : [4480] InitializeSecurityContext (Anmeldeinformationen = System.Ne t.SafeFreeCredential_SECURITY, Kontext = (null), Zielname = HTTP/mysvc.mycorp.com, inFlags = Delegieren, MutualAuth, Verbindung) System.Net Information: 0: [4480] InitializeSecurityContext (In-Puffer zählen = 1, Out-Buffer-Länge = 40, zurückgegebener Code = ContinueNeeded).

Eine Arbeitsmaschine erzeugt diese Ausgabe:

System.Net Information: 0: [3432] Verbindung # 57733168 - Empfangene Statusleiste: Version = 1.1, Statuscode = 401, StatusDescription = Unerlaubte. System.Net Information: 0: [3432] Verbindung # 57733168 - Header { Content-Type: text/html Server: Microsoft-IIS/8.0 WWW-Authenticate: Verhandeln, NTLM X-Powered-by: ASP.NET Datum: Mo, 10 Aug 2015 15:15:11 GMT Inhalt-Länge: 1293 } wurde empfangen. System.Net Informationen: 0: [3432] ConnectStream # 35016340 :: ConnectStream (Es wurde 1293 Bytes gepuffert.) System.Net Information: 0: [3432] Verknüpfung von HttpWebRequest # 64062224 mit ConnectStream # 35016340 System.Net Information: 0: [3432] Verknüpfung von HttpWebRequest # 64062224 mit HttpWebResponse # 64254500 System.Net Information: 0: [3432] Sicherheitspakete werden enumeriert: System.Net Information: 0: [3432] System.Net Information: 0: [3432 ] System.Net Information: 0: [3432] Kerberos System.Net Information: 0: [3432] NTLM System.Net Informationen: 0: [3432] Schannel System.Net Information: 0: [3432] Microsoft Einheitliches Sicherheitsprotokoll Prov ider System.Net Information: 0: [3432] WDigest System.Net Information: 0: [3432] TSSSP System.Net Information: 0: [3432] pku2u System.Net Information: 0: [3432] CredSSP

System.Net Information: 0: [3432] AcquireCredentialsHandle (Paket = Verhandeln, Absicht = Outbound, authdata = System.Net.SafeSspiAuthDataHandle) System.Net Information: 0: [3432] InitializeSecurityContext (Anmeldeinformationen = System.Net.SafeFreeCredential_SECURITY, conte xt = (null), target = HTTP/mysvc.mycorp.com, inFlags = Delegierter, MutualAuth, Verbindung)

System.Net Information: 0: [3432] InitializeSecurityContext (Anzahl von In-Buffers = 1, Länge von Out-Buffer = 40, zurückgebender Code = .

Ich frage mich, ob einige Konfiguration auf der fehlerhaften Maschine dies verursachen würde. Im Moment bin ich mir nicht sicher, wo ich als nächstes hinschauen soll.

Update: Hier ist der Code unserer einfachen Test-Tool:

RestClient Client = new RestClient("https://mysvc.mycorp.com/service.svc"); 
     Client.Authenticator = new NtlmAuthenticator("corp\\svc_account", "mypassword"); 
     var request = new RestRequest("api/Method", Method.POST); 
     request.RequestFormat = DataFormat.Json; 
     request.AddBody(new { Device_Key = "somestring" }); 
     request.Timeout = 200000; 


     RestResponse response = (RestResponse)Client.Execute(request); 

Update 2: Wir haben nun bestätigt, dass dieses Problem nur auf tritt neu gewinnen 7 installierte Maschinen, die eine aktualisierte Firmenimage. Fast Sieht aus wie ein Update in den letzten 2 Monaten.

+0

Könnten Sie die MCVE-Konsole-Anwendung, die Sie erstellt haben, posten? –

+0

Hier gehen Sie, ich habe den Code hinzugefügt – hoetz

Antwort

6

Das ist verrückt: Es stellte sich heraus, sobald ich .net 4.5 auf dem Windows 7-Rechner installiert, arbeitete die WebRequest! Wir glauben, dass der Fehler ein fehlender Patch des .NET 4.0 Framework war, der auf allen Client-Computern bereitgestellt wird. Also, patch Ihre Maschinen :)