Apache NTLM Auth от клиента C# не работает с самоопределяемыми NetworkCredentials

У меня есть офисный плагин, который подключает сервис с помощью HttpWebRequest,

Внутри домена я прохожу CredentialCache.DefaultNetworkCredentials так что все в порядке. За пределами домена пользователю необходимо предоставить имя пользователя, домен и пароль. Это не сработает.

Некоторая часть кода из этого:

CookieContainer cookies = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Post;
request.AllowAutoRedirect = true;
request.CookieContainer = cookies; // provide session cookie to handle redirects of login controller of the webservice

if (isWindowAuthentication) // isWindowAuthentication is set earlier by config
{
  if (Common.UserName.Length > 0)
  {
    string[] domainuser;
    string username;
    string domain;

    if (Common.UserName.Contains("@"))
    {
      domainuser = Common.UserName.Split('@');
      username = domainuser[0];
      domain = domainuser[1];
    }
    else
    {
      domainuser = Common.UserName.Split('\\');
      username = domainuser[1];
      domain = domainuser[0];
    }
    NetworkCredential nc = new NetworkCredential(username, Common.Password, domain);
    CredentialCache cache = new CredentialCache();
    cache.Add(request.RequestUri, "NTLM", nc);
    request.Credentials = cache;
  }
  else
  {
    request.Credentials = CredentialCache.DefaultNetworkCredentials;
  }
}

Позже я делаю запрос request.GetResponse();, Если я использую CredentialCache.DefaultNetworkCredentials тогда все работает нормально. В тот момент, когда я переключаюсь на свой собственный new NetworkCredential() часть аутентификации не проходит.

Я проверил логи Apache (это Apache 2.2, использующий мод SSPI). При успешном первом перенаправлении запроса на контроллер входа в систему, затем учетные данные запроса контроллера входа. Пройдено и работает (перенаправление на целевой сайт).

Лог 1 (работы):

192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "POST /ror/ioi/start?document%5Bguid%5D=%7Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%7D HTTP/1.1" 302 202
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 401 401
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 401 401
192.168.14.9 - rausch [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 302 156

Собственные учетные данные здесь Log 2 (не работают):

192.168.14.9 - - [25/Oct/2012:12:05:23 +0200] "POST /ror/ioi/start?document%5Bguid%5D=%7B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%7D HTTP/1.1" 302 202
192.168.14.9 - - [25/Oct/2012:12:05:23 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%257D HTTP/1.1" 401 401

Что я не понимаю, так это когда я проверяю, например, CredentialCache.DefaultNetworkCredentials.UserName тогда пусто

Кто-нибудь знает, что делать и как мне правильно настроить свои учетные данные, чтобы аутентификация работала как положено?

1 ответ

Решение

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

Проблема в том, что httpwebrequest не обрабатывайте аутентификацию, когда части веб-сайта запрашивают учетные данные, а некоторые - нет.

Фон:

Наш сайт имеет собственное управление сеансами и перенаправляет их на контроллер входа в систему, когда нет действующего сеанса. Только этот контроллер входа в систему установлен для проверки подлинности NTLM.

Мы сделали это потому, что у нас есть веб-сайт без аутентификации NTLM (нет 401, 302 цикла запросов в IE!), И мы проверяем его только один раз (и мы обрабатываем аутентификацию по разным URL-адресам, чтобы предотвратить проблему, из-за которой IE прекращает публикацию данных при отсутствии аутентификации). сайты => см. http://support.microsoft.com/?id=251404).

Решение:

Я обычно отправляю запрос на свою целевую страницу, а веб-сервер перенаправляет, аутентифицируется и перенаправляет обратно на целевую страницу. Поскольку httpwebrequest не обрабатывает это ни по какой причине, если у меня установлены собственные учетные данные (см. Код моего вопроса выше), я изменил код, чтобы выполнить однократную аутентификацию на контроллере входа в систему и сохранить сеанс в контейнере cookie.

Для всех последующих запросов я больше не аутентифицируюсь. Я добавляю контейнер cookie, и мой сервер получает действительный сеанс. Поэтому мне больше не нужно проходить аутентификацию. Побочный эффект - лучшая производительность таким образом.

Еще одна хитрость заключалась в том, что я не только использую httpwebrequest, я также использую элемент управления веб-формы. Поэтому я нашел решение добавить свою собственную сессию файлов cookie здесь: использовать файлы cookie от CookieContainer в WebBrowser (спасибо Аарону, который также избавил меня от многих проблем).

Другие вопросы по тегам