【发布时间】:2013-04-05 17:13:12
【问题描述】:
我需要使用 WCF,但它有一个证书,我需要禁用它的身份验证。 有谁知道我如何在 Delphi XE2 中做到这一点?
我已经尝试过以下代码:
第一次尝试:
Rio.HTTPWebNode.InvokeOptions:= [soIgnoreInvalidCerts,soAutoCheckAccessPointViaUDDI];
Rio 是 THTTPRIO。
第二次尝试:
class procedure ClasseTeste.OnBeforePost(const HTTPReqResp: THTTPReqResp;
Data: Pointer);
var
SecurityFlags: DWord;
SecurityFlagsLen: DWord;
Request: HINTERNET;
begin
Request := Data;
if soIgnoreInvalidCerts in Rio.HTTPWebNode.InvokeOptions then
begin
SecurityFlagsLen := SizeOf(SecurityFlags);
InternetQueryOption(Request, INTERNET_OPTION_SECURITY_FLAGS,
Pointer(@SecurityFlags), SecurityFlagsLen);
SecurityFlags := SecurityFlags or INTERNET_FLAG_IGNORE_CERT_CN_INVALID;
InternetSetOption(Request, INTERNET_OPTION_SECURITY_FLAGS,
Pointer(@SecurityFlags), SecurityFlagsLen);
end;
end;
rio.HTTPWebNode.OnBeforePost:= ClasseTeste.OnBeforePost;
我可以使用 c# 来做到这一点,代码如下:
channel = new ChannelFactory<WsMain.IWsInterface>("****");
channel.Credentials.UserName.UserName = "*****";
channel.Credentials.UserName.Password = "*****";
channel.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
【问题讨论】:
-
不应该在服务器端禁用吗?我想知道让客户能够禁用认证是否是一种安全行为...... :)
-
我同意你的观点,但在这种情况下,服务不是我们的。我知道可以在 C# 中禁用,我想在 Delphi 中执行相同的行为。
-
我真的不明白这里的问题:服务器上的证书是否以某种方式无效(自签名等)或服务器需要证书身份验证?我问这个是因为服务器可能有证书,但可能不需要证书身份验证——证书只能用于 SSL 任务。另外请告诉我们您遇到了什么错误?
-
服务器需要认证。 WS 的所有者告诉我必须在访问其方法之前禁用身份验证,这是使消费工作的唯一方法。没有删除证书要求,响应是一个简单的超时,而在 C#(删除要求)中返回是好的。
标签: web-services delphi delphi-xe2 x509certificate