401仅在特定计算机上调用Web服务

时间:2015-08-11 08:34:16

标签: c# httpwebrequest restsharp ntlm http-status-code-401

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

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

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

  

System.Net信息:0:[4480]连接#3741682 - 已接收标头   {   连接:保持活力   内容长度:1293   内容类型:text / html   日期:星期一,2015年8月10日12:37:49 GMT   服务器:Microsoft-IIS / 8.0   WWW-Authenticate:谈判,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] Schannel   System.Net信息:0:[4480] Microsoft统一安全协议提供程序   System.Net信息:0:[4480] WDigest   System.Net信息:0:[4480] TSSSP   System.Net信息:0:[4480] pku2u   System.Net信息:0:[4480] CREDSSP

     

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,   连接)System.Net信息: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 - 标题   {   内容类型:text / html   服务器:Microsoft-IIS / 8.0   WWW-Authenticate:谈判,NTLM   X-Powered-By:ASP.NET   日期:星期一,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:[3432]谈判   System.Net信息:0:[3432] NegoExtender   System.Net信息:0:[3432] Kerberos   System.Net信息:0:[3432] NTLM   System.Net信息:0:[3432] Schannel   System.Net信息:0:[3432] Microsoft统一安全协议提供程序   System.Net信息:0:[3432] WDigest   System.Net信息:0:[3432] TSSSP   System.Net信息:0:[3432] pku2u   System.Net信息:0:[3432] CREDSSP

     

System.Net信息:0:[3432] AcquireCredentialsHandle(package =   谈判,意图=出境,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);

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

1 个答案:

答案 0 :(得分:6)

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