Ошибка аутентификации https в Delphi. Появляется диалоговое окно.

У нас есть приложение delphi XE, которое использует протоколы SOAP (THTTPRIO и т. Д.), Которое (в delphi) по умолчанию работает через WinInet.dll. Мы исправили код аутентификации, чтобы он работал, используя аутентификацию https, и когда имя пользователя и пароль для https верны, все в порядке.

Проблема в том, что при неверных данных аутентификации вы получаете окно сообщения из Windows, которое, вероятно, выскакивает сам WinInet.dll. Я хочу убрать это диалоговое окно. Я не могу понять, как изменить мой Delphi SOAP, чтобы пароль не появлялся.

Ситуация отличается от этого вопроса следующими способами:

  1. Я делаю все, что делает он, включая вызов InternetSetOption (...) для установки имени пользователя и пароля. .

  2. Я не использую сервер с самоподписанным сертификатом, поэтому флаг soIgnoreInvalidCerts в моем случае неприменим.

  3. Каким-то образом мне кажется, что мне нужно получить несколько вызовов API в WinInet, чтобы запретить ему выскакивать InternetErrorDlg , который у него есть (в некоторых версиях Windows указаны параметры безопасности Windows), который всплывает, чтобы спросить Пользователь.

  4. В моем случае используются имя пользователя и пароль, которые есть в нашем файле конфигурации, они неверны (устарели), и поэтому мы хотим, чтобы код WinInet просто возвращал ошибку, а не открывал диалоговое окно.

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

Некоторые тупики, в которых я следил:

WinInet MSDN docs для PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI - похоже, это не относится к пользователю WinInet, а скорее к подключаемому модулю.

В документах WinInet MSDN обсуждается InternetSetOption, и некоторые группы новостей привели меня к следующему коду обработчика событий перед публикацией:

procedure TMyDevice.HTTPWebNodeOnBeforePost(
  const HTTPReqResp: SOAPHTTPTrans.THTTPReqResp; Data: Pointer);
var
 SecurityFlagsLen:DWORD;
 SecurityFlags:DWORD;
begin
  { authentication, NTLM+HTTPS, WinInet authentication set via WinInet SET INTERNET OPTION API.
    This approach recommended on newsgroups for https basic authentication.  }

    if fUserName<>'' then
   if not InternetSetOption(Data,
               INTERNET_OPTION_USERNAME,
               PChar(fUserName),
               Length(fUserName)) then
     raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError));

   if fPassword<>'' then
  if not InternetSetOption(Data,
               INTERNET_OPTION_PASSWORD,
               PChar(fPassword),
               Length (fPassword)) then
     raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError));

      { possible type of hackage: WinInet Security option flags to stop password box? }
     SecurityFlagsLen := SizeOf(SecurityFlags);
      InternetQueryOption({Request}data, INTERNET_OPTION_SECURITY_FLAGS,
      Pointer(@SecurityFlags), SecurityFlagsLen);
      SecurityFlags := SecurityFlags or SECURITY_FLAG_something;
      InternetSetOption({Request}data, INTERNET_OPTION_SECURITY_FLAGS,
      Pointer(@SecurityFlags), SecurityFlagsLen);
end;

Этот код заставляет пароль работать, но когда пользователь ввел неверный пароль, как мне получить вызов SOAP завершится ошибкой или вызовет исключение вместо появления окна сообщения?

7
задан Community 23 May 2017 в 10:34
поделиться