Мне нужно получить доступ к внешней службе (веб-приложению) через один сервер (защищенный брандмауэром), поэтому я должен ретранслировать / туннелировать 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" Заголовок + Значение.Где я могу получить это значение?Спасибо за вашу помощь или за подсказку, где искать дополнительную информацию.