HttpWebResponse - Как установить заголовок проверки подлинности NTLM - PullRequest
1 голос
/ 05 сентября 2011

Мне нужно получить доступ к внешней службе (веб-приложению) через один сервер (защищенный брандмауэром), поэтому я должен ретранслировать / туннелировать HTTP-запросы через небольшое приложение-службу C #.

Iнаписал HttpListener, ожидая запросов, вызывая внешний Web-сервер, получая его ответ и записывая его клиенту.Эта часть приложения работает без сбоев.

В целях аудита я включил проверку подлинности NTLM на слушателе, чтобы можно было регистрировать, какие пользователи обращались к этому сервису.Пока все хорошо.

listener.AuthenticationSchemes = AuthenticationSchemes.Ntlm;

Аутентификация работает, клиент автоматически получает ответ HTTP 401 с заголовком WWW- "Authenticate: NTLM", клиент повторно отправляет запрос с заголовком NTLM-Authorization,сервер отвечает на вызов, клиент отвечает на запрос -> клиент аутентифицирован, я могу получить доступ к свойству Identity в HttpListenerContext.

Но я думаю, что я делаю ошибку, когда яписать ответ обратно клиенту.Когда тот же клиент выполняет другой запрос, он должен выполнить всю процедуру аутентификации с самого начала.

response.StatusCode = (Int32)((HttpWebResponse)remoteResponse).StatusCode;
foreach (var h in remoteResponse.Headers.AllKeys) {
  if (!(new string[] { "Content-Type", "Content-Length" }).Contains(h)) {
    response.AddHeader(h, response.Headers[h]);
  }
}
// Am I missing a Header here???
response.ContentType = remoteResponse.ContentType;

using (Stream input = remoteResponse.GetResponseStream()) {
  using (Stream output = response.OutputStream) {
    input.CopyTo(output);
  }
}

После просмотра связи с веб-сайтом IIS я узнал, что IIS отвечает на обычный запрос с помощью"WWW.Authenticate" Заголовок + Значение.Где я могу получить это значение?Спасибо за вашу помощь или за подсказку, где искать дополнительную информацию.

...