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