HttpWebRequest, не передающий Учетные данные

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

ограничения Перед внешним ключом (иначе декларативная ссылочная целостность или DRI) много времени было проведено, реализовав эти отношения с помощью триггеров. То, что мы можем формализовать отношения декларативным ограничением, очень мощно.

@John - Другие базы данных могут автоматически создать индексы для внешних ключей, но SQL Server не делает. В SQL Server отношения внешнего ключа являются только ограничениями. Вы должны, определил Ваш индекс на внешних ключах отдельно (который может иметь выгоду.)

Редактирование: я хотел бы добавить, что, IMO, использование внешних ключей в поддержку НА УДАЛЯЕТ, или КАСКАД ON UPDATE является не обязательно хорошей вещью. На практике я нашел, что каскад на удаляет, должен быть тщательно рассмотрен на основе отношений данных - например, сделать у Вас есть естественный родительский ребенок, где это может быть в порядке или является связанной таблицей ряд справочных значений. Используя каскадные обновления подразумевает, что Вы позволяете первичному ключу одной таблицы быть измененным. В этом случае у меня есть общее философское разногласие в этом, первичный ключ таблицы не должен изменяться. Ключи должны быть по сути постоянными.

32
задан Asbjørn Ulsberg 19 April 2012 в 08:15
поделиться

4 ответа

Если ваш сервер использует аутентификацию NTLM, вы можете попробовать следующее:

CredentialCache cc = new CredentialCache();
cc.Add(
    new Uri("https://mywebserver/webpage"), 
    "NTLM", 
    new NetworkCredential("user", "password"));
request.Credentials = cc;
21
ответ дан 27 November 2019 в 19:56
поделиться

Посмотрите, появляется ли оно при использовании старомодного метода:

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);
48
ответ дан 27 November 2019 в 19:56
поделиться

Какой механизм аутентификации защищает веб-службу? Учетные данные, установленные для HttpWebRequest , будут передаваться только через HTTP-заголовок Authorization через Basic , Digest или NTLM . Итак, если ваш веб-сервис защищен с помощью WS-Security , NetworkCredentials , вероятно, вообще не будут переданы в схему аутентификации, потому что WS-Security не работает на уровне HTTP.

Вам следует создать прокси-сервер клиента веб-службы для веб-службы с помощью инструмента командной строки wsdl.exe или чего-то подобного. Это даст вам доступ к схемам аутентификации, поддерживающим веб-службы.

Обновление после комментариев:

Похоже, что HttpWebRequest должен получить запрос WWW-Authenticate с 401 Unauthorized , прежде чем он сможет правильно аутентифицироваться через SSL. Я предполагаю, что в HttpWebRequests есть два отдельных кодовых пути, обрабатывающих обычный HTTP-трафик и зашифрованный HTTPS-трафик. В любом случае, вы должны попробовать:

  1. Выполнить неаутентифицированный HttpWebRequest на https: //.../ URI.
  2. Получить 401 Unauthorized ответ.
  3. Выполнить тот же запрос, теперь с двумя установленными Учетными данными (не уверен, что PreAuthenticate должно иметь значение true или false ; проверьте и то, и другое).
  4. Теперь вы должны получить 200 OK или то, чем ответит ваша веб-служба.

Другой вариант - создать заголовок Авторизация самостоятельно при начальном запросе:

string credentials = String.Format("{0}:{1}", username, password);
byte[] bytes = Encoding.ASCII.GetBytes(credentials);
string base64 = Convert.ToBase64String(bytes);
string authorization = String.Concat("Basic ", base64);
request.Headers.Add("Authorization", authorization);
26
ответ дан 27 November 2019 в 19:56
поделиться

Попробуйте установить для request.PreAuthenticate значение true.

3
ответ дан 27 November 2019 в 19:56
поделиться
Другие вопросы по тегам:

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