使用Delphi XE8,我导入了WSDL并使用HTTPRIO组件对于使用身份验证:
property HTTPRIO:
HTTPWebNode ->
ClientCertificate -> CertName = ServiceSSL.cer
InvokeOptions [soIgnoreInvalidCerts,soPickFirstClientCertificate]
Event HTTPRIO
HTTPWebNode -> OnBeforePost = HTTPRIO1HTTPWebNode1BeforePost
procedure HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
Data: Pointer);
var
auth: String;
FUserName, FPassword : string;
begin
FUserName:=UtenteTS;
FPassword:=PassTS;
auth := 'Authorization: Basic ' + TNetEncoding.Base64.Encode(FUserName + ':' + FPassword);
HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
end;
效果很好。
问题是:将带有数字签名卡的智能卡读卡器插入PC时,在身份验证过程中,它与智能卡通信,打开PIN请求窗口。
我不想要这个,我想优先通过HTTPRIO1HTTPWebNode1BeforePost进行身份验证!
注意:
运行调试,HTTPRIO1HTTPWebNode1BeforePost,先进行处理,然后与智能卡已启动。如何禁用智能卡读取器读取?
具有数字签名的卡需要连接到PC,因为我的程序必须对文档进行数字签名。
我注意到在调用HTTPRIO1HTTPWebNode1BeforePost之后
此代码执行两次
{ line 1151 of soap.SOAPHTTPtrans.pas Posting Data Event }
if Assigned(FOnPostingData) then
FOnPostingData(DatStr.Size, BuffSize);
RetVal := ERROR_SUCCESS;
{$IFDEF UNICODE}
HttpSendRequest(Request, nil, 0,
DatStr.Bytes, DatStr.Size);
{$ELSE}
HttpSendRequest(Request, nil, 0,
@DatStr.DataString[1],
Length(DatStr.DataString));
{$ENDIF}
RetVal := HandleWinInetError(GetLastError, Request, True);
case RetVal of
ERROR_SUCCESS: break;
ERROR_CANCELLED: System.SysUtils.Abort;
ERROR_INTERNET_FORCE_RETRY: {Retry the operation};
end;
第一次RetVal传递的值为12032 = ERROR_INTERNET_FORCE_RETRY:{重试操作};
第二步HttpSendRequest(Request,nil,0,DatStr.Bytes,DatStr.Size);启动智能卡读取器并打开消息登录窗口,该窗口要求输入在读取器中输入的数字签名的PIN。 RetVal = 0
我尝试使用InternetSetOption(Data,INTERNET_FLAG_NO_AUTH,????,????),但我不知道该怎么做。
我不希望打开登录消息框,要求提供智能卡PIN。我能怎么做?
阅读此:我尝试过:post“用WinHTTP组件替换WinINet。两者都具有非常接近的API,第二个不创建任何UI交互,但是将返回错误代码,就像其他任何API一样。WinINet的UI部分对于某些软件来说可能是个好主意,但是听起来好像不符合您的需求。“
如何将winHttp与HttpRio一起使用?我尝试过:
uses winHTTP;
...
procedure HTTPRIOHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
auth := 'Authorization: Basic ' + TNetEncoding.Base64.Encode(FUserName + ':' + FPassword);
if not WinHttpAddRequestHeaders(Data, PChar(auth), Length(auth), WinHTTP_ADDREQ_FLAG_ADD) then ShowMessage('demat WinHttpAddRequestHeaders: ' + SysErrorMessage(GetLastError()));
错误:无效的句柄。
我想尝试使用带有HttpRio的winHttp而不是winInet。如我所读,使用winHttp时,我将不会收到Windows安全窗口(PIN请求)。我不知道如何在HttpRio中使用winHttp。你可以帮我吗?