【问题标题】:How to debug NTLM authentication on Windows Server 2012 r2如何在 Windows Server 2012 r2 上调试 NTLM 身份验证
【发布时间】:2015-07-13 11:10:25
【问题描述】:

我在运行 Windows Server 2012 r2 的虚拟机上设置了 SOAP 服务。 我使用 NTLM 保护它,并设法使用 SoapUI 从主机访问它。到目前为止一切顺利...

我现在尝试访问我的服务,仍然是从主机,但这次使用的是 golang 程序。我正在使用this library 来执行此操作(我只需要实现 GenerateNegotiateMessage() 方法并确保 Negotiate 标志与 SoapUI 的标志相同)。

为了确保我做对了,我下载了 SoapUI 的源代码,并比较了我的 golang 程序和 SoapUI 的输出(NegotiateMessage 和 AuthenticateMessage)。如果我修复输入(时间戳和随机客户端质询),我会得到相同的输出。但是,当我尝试连接到该服务时,我收到一个 401 并显示“由于凭据无效而拒绝访问”。无需说我 100% 确定凭据是正确的,因为我能够使用 SoapUI 使用相同的凭据访问服务。所以我的go代码一定有问题。但要弄清楚,我需要来自我的 Windows Server 的更多日志。知道我可以从哪里开始寻找吗?

下面是我的 Soap 服务的 web.config:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5"/>
    <httpRuntime targetFramework="4.5"/>
    <trace enabled="true" pageOutput="true" requestLimit="40" localOnly="false"/>
  </system.web>
  <system.serviceModel>

    <diagnostics wmiProviderEnabled="true">
      <messageLogging
           logEntireMessage="true"
           logMalformedMessages="true"
           logMessagesAtServiceLevel="true"
           logMessagesAtTransportLevel="true"
           maxMessagesToLog="3000"
       />
    </diagnostics>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <bindings>
      <basicHttpBinding>
        <binding>
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Ntlm" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="All" propagateActivity="true">
        <listeners>
          <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\logs\TextWriterOutput.log"/>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

非常感谢您的帮助!

【问题讨论】:

  • Gpack,仅供参考 Stack Overflow 不是一个论坛,用 [已解决] 更不用说“标记”标题了。相反,接受的答案的存在将其标记为“已回答”,以便显示和搜索。
  • 明白。对不起...

标签: web-services soap go ntlm windows-server-2012-r2


【解决方案1】:

我最终设法解决了我的问题。 这是因为我没有在我的 golang 程序中完全阅读我的 HTTP 请求的响应正文。因此,每次我发出请求时,服务器都会将其解释为新连接,但 NTLM 身份验证方案要求所有请求都在单个连接中发出。实际上是这个answer 解决了我的问题。

对于未来的编码人员,如果您想重用相同的连接,您应该使用以下代码:

res, _ := client.Do(req)
io.Copy(ioutil.Discard, res.Body)
res.Body.Close()

总而言之,我没有设法从 Windows 的日志中获得太多信息。让我走上正轨的工具是 Failed Request Tracer,您可以从 IIS 管理器访问它,以及用于比较我的程序和 SoapUI 发出的请求的老式 Wireshark。

希望这对某人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2018-05-28
    • 2018-09-28
    • 1970-01-01
    相关资源
    最近更新 更多