DelphiXE8和WSDL,通过智能卡读卡器禁用身份验证

问题描述 投票:0回答:1

使用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请求窗口。

enter image description here

我不想要这个,我想优先通过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。我能怎么做?

wsdl basic-authentication delphi-xe8 smartcard-reader
1个回答
0
投票

阅读此:我尝试过: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。你可以帮我吗?

© www.soinside.com 2019 - 2024. All rights reserved.