Mamy aplikację delphi XE, która używa komunikacji SOAP (THTTPRIO itp.), Która (w delphi) działa domyślnie nad WinInet.dll. Naprawiliśmy kod uwierzytelniający, aby działał, używając uwierzytelniania https, a gdy nazwa użytkownika i hasło dla https są poprawne, wszystko jest w porządku.Usterka uwierzytelniania Delphi https wyskakuje okno dialogowe
Problem polega na tym, że gdy dane uwierzytelniające są niepoprawne, pojawia się okno komunikatu z systemu Windows, które prawdopodobnie pojawiło się w samym WinInet.dll. Chcę, aby to okno dialogowe zniknęło. Nie mogę wymyślić, jak zmienić moje SOAP Delphi, aby hasło nie pojawiło się.
Sytuacja jest different than this question w jeden z następujących sposobów:
Robię wszystko, co robi, w tym powołanie InternetSetOption (...), aby ustawić nazwę użytkownika i hasło.
Nie używam serwera z samopodpisanym certyfikatem, więc flaga soIgnoreInvalidCerts nie ma zastosowania w moim przypadku.
Jakoś myślę, że trzeba uzyskać niektóre API stawia pod WinInet, aby poinformować go, aby nie pop-up
InternetErrorDlg
że ma (niektóre wersje Windows powiedzieć Opcje zabezpieczeń systemu Windows), które pojawia się zadać użytkownikowi.W moim przypadku nazwa użytkownika i hasło, które mamy w naszym pliku konfiguracyjnym są używane, są błędne (nieaktualne) i dlatego chcemy, aby kod WinInet po prostu wyświetlał błąd zamiast pojawiać się w oknie dialogowym .
Być może inne pytanie facet naprawdę wymyślił, jak to zrobić, ale szczegóły na to pytanie są niewystarczające, aby zobaczyć, jak to zrobił. Przyjęta odpowiedź nie działa dla mnie.
Niektóre martwe końce Mam następuje:
WinInet MSDN docs dla PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI
- że nie wydaje się mieć zastosowanie do użytkownika WinInet, raczej do wtyczki.
WinInet MSDN docs dyskutować InternetSetOption, a niektóre grupy mają doprowadzić mnie do następującego kodu on-przed-post obsługi zdarzenia:
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;
Kod ten sprawia, że praca hasła, ale gdy wprowadzone hasło użytkownika jest nieprawidłowa , w jaki sposób uzyskać wywołanie SOAP, aby niepowodzenie, lub podnieść wyjątek, zamiast pojawiać się okno komunikatu?
Czy spróbować ustawienie [ '] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa385328 INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY' (v = vs.85 .aspx)) flagi' INTERNET_OPTION_ERROR_MASK' ? –
Ta flaga dodaje dodatkowy raport o błędzie, ale nie usuwa go. Co ciekawe, nie jest to zdefiniowane w WinInet.pas. –