У нас есть приложение delphi XE, которое использует протоколы SOAP (THTTPRIO и т. Д.), Которое (в delphi) по умолчанию работает через WinInet.dll. Мы исправили код аутентификации, чтобы он работал, используя аутентификацию https, и когда имя пользователя и пароль для https верны, все в порядке.
Проблема в том, что при неверных данных аутентификации вы получаете окно сообщения из Windows, которое, вероятно, выскакивает сам WinInet.dll. Я хочу убрать это диалоговое окно. Я не могу понять, как изменить мой Delphi SOAP, чтобы пароль не появлялся.
Ситуация отличается от этого вопроса следующими способами:
Я делаю все, что делает он, включая вызов InternetSetOption (...) для установки имени пользователя и пароля. .
Я не использую сервер с самоподписанным сертификатом, поэтому флаг soIgnoreInvalidCerts в моем случае неприменим.
Каким-то образом мне кажется, что мне нужно получить несколько вызовов API в WinInet, чтобы запретить ему выскакивать InternetErrorDlg
, который у него есть (в некоторых версиях Windows указаны параметры безопасности Windows), который всплывает, чтобы спросить Пользователь.
В моем случае используются имя пользователя и пароль, которые есть в нашем файле конфигурации, они неверны (устарели), и поэтому мы хотим, чтобы код 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 завершится ошибкой или вызовет исключение вместо появления окна сообщения?