仅在特定机器上调用 Web 服务时出现 401

Posted

技术标签:

【中文标题】仅在特定机器上调用 Web 服务时出现 401【英文标题】:401 when calling Web Service only on particular machines 【发布时间】: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 控制台应用程序? 给你,我添加了代码 【参考方案1】:

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

【讨论】:

以上是关于仅在特定机器上调用 Web 服务时出现 401的主要内容,如果未能解决你的问题,请参考以下文章

从角度访问webapi时出现401未经授权的错误

向 web api 发送 ajax 请求时出现 401 Unauthorized

使用服务帐户通过 OAuth 2.0 调用 v3 Google 日历 API 时出现“需要登录”401 未经授权的消息

调用共享 WebMethod 时出现未知 Web 方法异常

从 finally 块调用回调函数时出现问题

Google Play 游戏:UnlockAchievement 调用时出现 401 错误