401仅在特定计算机上调用Web Service时

hoe*_*etz 15 c# ntlm httpwebrequest restsharp http-status-code-401

我们使用C#开发了一个WPF应用程序,并使用RestSharp与一个简单的Web服务进行通信,如下所示:

Client = new RestClient(serviceUri.AbsoluteUri);
Client.Authenticator = new NtlmAuthenticator(SvcUserName, SvcPassword.GetString());
Run Code Online (Sandbox Code Playgroud)

这一切都很有效,直到我们收到一些电话(大多数工作)的应用程序无法连接到服务.用fiddler直接调用服务方法.然后我们提取了一个小的.net控制台应用程序并尝试使用RestSharp进行服务调用并直接使用HttpWebRequest,然后再次使用401失败.现在我们启用了System.Net跟踪并注意到了一些事情.在第一个401,这是正常的,故障机器产生这个日志:

System.Net信息:0:[4480]连接#3741682 - 收到的标题{连接:保持活动内容长度:1293内容类型:text/html日期:星期一,10八月2015 12:37:49 GMT服务器:Microsoft -IIS/8.0 WWW-Authenticate:Negotiate,NTLM X-Powered-By:ASP.NET}.System.Net信息:0:[4480] ConnectStream#39451090 :: ConnectStream(缓冲1293字节.)System.Net信息:0:[4480]将HttpWebRequest#2383799与ConnectStream相关联#39451090 System.Net信息:0:[4480]将HttpWebRequest#2383799与HttpWebResponse相关联#19515494 System.Net信息:0:[4480]枚举安全包:System.Net信息:0:[4480]协商System.Net信息:0:[4480] NegoExtender System.Net信息:0 :[4480] Kerberos System.Net信息:0:[4480] NTLM系统.

System.Net信息:0:[4480] AcquireCredentialsHandle(package = NTLM,intent = Outbound,authdata = (string.empty)\ corp\svc_account)

System.Net信息:0:[4480] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY,context =(null),targetName = HTTP/mysvc.mycorp.com,inFlags = Delegate,MutualAuth,Connection)System.Net Information:0 :[4480] InitializeSecurityContext(In-Buffers count = 1,Out-Buffer length = 40,返回代码= ContinueNeeded).

工作机器产生这样的输出:

System.Net信息:0:[3432]连接#57733168 - Empfangene Statusleiste:Version = 1.1,StatusCode = 401,StatusDescription = Unauthorized.System.Net信息:0:[3432]连接#57733168 - 标题{Content-Type:text/html服务器:Microsoft-IIS/8.0 WWW-Authenticate:Negotiate,NTLM X-Powered-By:ASP.NET Date:Mon, 2015年8月10日15:15:11 GMT内容长度:1293} wurden empfangen.System.Net信息:0:[3432] ConnectStream#35016340 :: ConnectStream(Es wurden 1293 Bytes gepuffert.)System.Net信息:0:[3432]将HttpWebRequest#64062224与ConnectStream相关联#35016340 System.Net信息:0:[ 3432]将HttpWebRequest#64062224与HttpWebResponse关联#64254500 System.Net信息:0:[3432] Sicherheitspakete werden enumeriert:System.Net信息:0:

System.Net信息:0:[3432] AcquireCredentialsHandle(package = Negotiate,intent = Outbound,authdata = System.Net.SafeSspiAuthDataHandle) System.Net信息:0:[3432] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY,context = (null),targetName = HTTP/mysvc.mycorp.com,inFlags = Delegate,MutualAuth,Connection)

System.Net信息:0:[3432] InitializeSecurityContext(Anzahl von In-Buffers = 1,LängevonOut-Buffer = 40,zurückgegebenerCode= ContinueNeeded).

我想知道故障机器上的某些配置是否会导致这种情况.目前我不知道下一步该往下看.

更新:这是我们简单测试工具的代码:

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);
Run Code Online (Sandbox Code Playgroud)

更新2:我们现在已确认此问题仅发生在新安装的具有更新企业映像的win 7计算机上.几乎看起来在过去两个月中的某些更新与我们紧密相关.

hoe*_*etz 6

这很疯狂:事实证明,只要我在Windows 7机器上安装了.net 4.5,WebRequest就可以了!我们认为,罪魁祸首是部署到所有客户端计算机的.NET 4.0 Framework的缺失补丁.所以,补丁你的机器:)