2015-07-13 2 views
1

Я установил службу SOAP на виртуальной машине под управлением Windows Server 2012 r2. Я закрепил его с помощью NTLM, и мне удалось получить к нему доступ с главного компьютера, используя SoapUI. До сих пор так хорошо ...Как отлаживать аутентификацию NTLM в Windows Server 2012 r2

Теперь я пытаюсь получить доступ к моей службе, все еще от хоста, но с помощью программы golang на этот раз. Я использую this library для этого (мне нужно было реализовать метод GenerateNegotiateMessage() и убедиться, что флаги Negotiate совпадают с флажками SoapUI).

Чтобы убедиться, что я сделал все правильно, я загрузил исходный код SoapUI и сравнил выходы (NegotiateMessage и AuthenticateMessage) моей программы golang и SoapUI. Если я исправляю входы (временная метка и случайный вызов клиента), я получаю одинаковые результаты. Тем не менее, когда я пытаюсь подключиться к службе, я получаю 401 с «Доступ лишен из-за недействительных учетных данных». Не нужно говорить, что я на 100% уверен, что учетные данные являются правильными, поскольку я могу получить доступ к службе с теми же учетными данными, используя SoapUI. Поэтому в моем коде go должно быть что-то не так. Но чтобы понять это, мне понадобится больше журналов с моего Windows Server. Любая идея, где я мог бы начать искать?

Ниже 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

Gpack, FYI [so] не является форумом, нежелательно «тегировать» заголовки на всех гораздо меньше [SOLVED]. Вместо этого наличие принятого ответа означает его «ответ» на показ и поиск. –

+0

Понял. Сожалею... – Gpack

ответ

0

В конечном итоге мне удалось решить мою проблему. Это произошло из-за того, что я не читал полностью тело ответа моего HTTP-запроса в моей программе golang. Поэтому каждый раз, когда я делал запрос, сервер интерпретировался как новое соединение, но для схемы аутентификации NTLM требуется, чтобы все запросы выполнялись в одном соединении. На самом деле это answer, который решил мою проблему.

Для будущих кодеров, это код, который вы должны использовать, если вы хотите повторно использовать то же самое соединение:

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

В заключение, мне не удалось получить много информации из журналов Windows. Инструментами, которые поставили меня на правильный путь, были Failed Request Tracer, с помощью которых вы можете получить доступ из диспетчера IIS и старого окна Wireshark для сравнения запросов, сделанных моей программой, и приложений SoapUI.

Надеюсь, это может быть полезно кому-то.

Смежные вопросы