Chúng tôi có một ứng dụng XE delphi sử dụng SOAP (THTTPRIO vv) thông tin liên lạc (trong delphi) hoạt động trên WinInet.dll, theo mặc định. Chúng tôi đã sửa mã xác thực để nó hoạt động, sử dụng xác thực https và khi tên người dùng và mật khẩu cho https là chính xác, mọi thứ đều ổn.Delphi soap https xác thực thất bại bật lên một hộp thoại
Vấn đề là khi chi tiết xác thực không chính xác, bạn nhận được một hộp thông báo từ Windows, có thể đang được xuất hiện bởi chính WinInet.dll. Tôi muốn làm hộp thoại đó biến mất. Tôi không thể tìm ra cách thay đổi SOAP Delphi của tôi để mật khẩu sẽ không xuất hiện.
Tình hình là different than this question theo các cách sau:
tôi đang làm tất cả những điều mà anh đang làm, bao gồm cả gọi InternetSetOption (...) để thiết lập tên người dùng và mật khẩu.
Tôi không sử dụng máy chủ có chứng chỉ tự ký, vì vậy cờ soIgnoreInvalidCerts không áp dụng cho trường hợp của tôi. Bằng cách nào đó, tôi nghĩ rằng tôi cần phải nhận được một số cuộc gọi API vào WinInet để cho nó không bật lên
InternetErrorDlg
mà nó có (một số phiên bản của cửa sổ nói Windows Security Options) bật lên để hỏi người dùng.Trong trường hợp của tôi tên người dùng và mật khẩu chúng tôi có trong tệp cấu hình đang được sử dụng, sai (lỗi thời) và vì vậy chúng tôi muốn mã WinInet chỉ trả lại lỗi thay vì bật hộp thoại .
Có lẽ câu hỏi khác mà anh chàng thực sự đã tìm ra cách thực hiện điều này, nhưng chi tiết về câu hỏi đó không đủ để xem anh ấy đã làm như thế nào. Câu trả lời được chấp nhận không phù hợp với tôi.
Một số ngõ cụt Tôi đã theo:
WinInet MSDN tài liệu cho PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI
- đó dường như không được áp dụng cho một người dùng WinInet, chứ không phải để một plugin.
WinInet MSDN thảo luận InternetSetOption, và một số nhóm tin có đưa tôi đến với mã xử lý sự kiện trên trước khi đăng bài sau đây:
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;
Mã này làm cho công việc mật khẩu, nhưng khi mật khẩu nhập của người sử dụng là sai , làm cách nào để nhận cuộc gọi SOAP bị lỗi hoặc tăng ngoại lệ, thay vì bật lên một hộp thư?
Bạn đã thử đặt ['INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa385328 (v = vs.85) .aspx) cờ trong' INTERNET_OPTION_ERROR_MASK' ? –
Cờ đó thêm báo cáo lỗi bổ sung, nó không mất một báo cáo. Điều thú vị là nó không được định nghĩa trong WinInet.pas. –