【发布时间】:2015-11-03 09:23:38
【问题描述】:
我们已经使用 C# 开发了一个 WPF 应用程序,并且正在使用 RestSharp 与一个简单的 Web 服务进行通信,如下所示:
Client = new RestClient(serviceUri.AbsoluteUri);
Client.Authenticator = new NtlmAuthenticator(SvcUserName, SvcPassword.GetString());
这一切都很好,直到我们收到在某些机器上(大多数工作)应用无法连接到服务的调用。 使用提琴手直接调用服务方法有效。然后我们提取了一个小的 .net 控制台应用程序并尝试使用 RestSharp 和直接使用 HttpWebRequest 进行服务调用,但它再次失败并出现 401。 现在我们启用了 System.Net 跟踪并注意到了一些东西。在第一个 401 之后,这是正常的,故障机器产生这个日志:
System.Net 信息:0:[4480] Connection#3741682 - 接收到的标头 { 连接:保持活动 内容长度:1293 内容类型:文本/html 日期:2015 年 8 月 10 日星期一 12:37:49 GMT 服务器:Microsoft-IIS/8.0 WWW-认证:协商,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,意图 = 出站,身份验证数据 = (string.empty)\corp\svc_account)
System.Net 信息:0:[4480] 初始化安全上下文(凭据 = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = HTTP/mysvc.mycorp.com,inFlags = 委托,MutualAuth, 连接)System.Net 信息:0:[4480] InitializeSecurityContext(缓冲区内计数=1,缓冲区外长度=40, 返回代码=ContinueNeeded)。
一台工作机器产生这个输出:
System.Net 信息:0 : [3432] Connection#57733168 - Empfangene Statusleiste:版本 = 1.1,StatusCode = 401,StatusDescription = 未授权。 System.Net 信息:0:[3432] Connection#57733168 - 标头 { 内容类型:文本/html 服务器:Microsoft-IIS/8.0 WWW-认证:协商,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 = 协商,intent = Outbound,authdata = System.Net.SafeSspiAuthDataHandle) System.Net 信息:0:[3432] 初始化安全上下文(凭据 = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = HTTP/mysvc.mycorp.com,inFlags = 委托、相互验证、连接)
System.Net 信息:0:[3432] InitializeSecurityContext(Anzahl von In-Buffers = 1,Länge von Out-Buffer = 40,zurückgegebener 代码 = 需要继续)。
我想知道故障机器上的某些配置是否会导致这种情况。目前我不确定下一步该去哪里。
更新: 这是我们简单测试工具的代码:
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 计算机上。几乎看起来过去 2 个月的一些更新让我们感到厌烦。
【问题讨论】:
-
能否发布您创建的 MCVE 控制台应用程序?
-
给你,我添加了代码
标签: c# httpwebrequest restsharp ntlm http-status-code-401