我在运行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>
非常感谢你的帮助!
答案 0 :(得分:0)
我最终设法解决了我的问题。 它来自于我在golang程序中完全没有读取我的HTTP请求的响应主体这一事实。因此,每次发出请求时,服务器都会被解释为新连接,但NTLM身份验证方案要求在单个连接中进行所有请求。实际上这answer解决了我的问题。
对于将来的编码器,如果您想重用相同的连接,这是您应该使用的代码:
res, _ := client.Do(req)
io.Copy(ioutil.Discard, res.Body)
res.Body.Close()
总而言之,我没有设法从Windows的日志中获取更多信息。让我走上正轨的工具是失败的请求跟踪器,您可以从IIS管理器和goold旧的Wireshark访问,以比较我的程序和SoapUI的请求。
希望这对某人有用。