Как я могу сделать дайджест-аутентификацию с HttpWebRequest?

Различные статьи (1, 2) я обнаружил, делают этот взгляд достаточно легким:

WebRequest request = HttpWebRequest.Create(url);

var credentialCache = new CredentialCache();
credentialCache.Add(
  new Uri(url), // request url
  "Digest", // authentication type
  new NetworkCredential("user", "password") // credentials
);

request.Credentials = credentialCache;

Однако это только работает на URL без параметров URL. Например, я могу загрузить http://example.com/test/xyz.html очень хорошо, но когда я пытаюсь загрузить http://example.com/test?page=xyz, результатом являются 400 Плохих сообщений Запроса со следующим в журналах сервера (рабочий Apache 2.2):

Digest: uri mismatch -  does not match request-uri 

Моя первая идея состояла в том, что спецификация обзора требует, чтобы параметры URL были удалены из хеша обзора - но удаление параметра от URL передало credentialCache.Add() не изменил вещь. Таким образом, это должно быть наоборот, и где-нибудь в.NET платформа неправильно удаляет параметр из URL.

19
задан Cygon 3 July 2010 в 18:54
поделиться

2 ответа

Я думаю, что второй URL-адрес указывает на динамическую страницу, и вы должны сначала вызвать его с помощью GET, чтобы получить HTML, а затем загрузить его. Однако опыта в этой области нет.

0
ответ дан 30 November 2019 в 05:15
поделиться

Вы сказали, что удалили параметры строки запроса, но пытались ли вы полностью вернуться к хосту? Каждый пример CredentialsCache.Add (), который я видел, похоже, использует только хост, а в документации для CredentialsCache.Add () параметр Uri указан как «uriPrefix», что кажется красноречивым.

Другими словами, попробуйте следующее:

Uri uri = new Uri(url);
WebRequest request = WebRequest.Create(uri);

var credentialCache = new CredentialCache(); 
credentialCache.Add( 
  new Uri(uri.GetLeftPart(UriPartial.Authority)), // request url's host
  "Digest",  // authentication type 
  new NetworkCredential("user", "password") // credentials 
); 

request.Credentials = credentialCache;

Если это сработает, вам также нужно будет убедиться, что вы не добавляете одни и те же «полномочия» в кеш более одного раза ... все запросы к одному и тому же хост должен иметь возможность использовать ту же запись в кэше учетных данных.

6
ответ дан 30 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: