Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在HTTPWebRequest中检测客户端证书身份验证请求?_C#_.net_Httpwebrequest_Http Authentication_Client Certificates - Fatal编程技术网

C# 如何在HTTPWebRequest中检测客户端证书身份验证请求?

C# 如何在HTTPWebRequest中检测客户端证书身份验证请求?,c#,.net,httpwebrequest,http-authentication,client-certificates,C#,.net,Httpwebrequest,Http Authentication,Client Certificates,我正在使用HTTPWebRequest访问一个需要客户端证书的页面 我使用以下代码,一切正常 HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(textBox1.Text); X509Certificate2 userCert = SelectClientCertificate(); if (userCert != null) myReq.ClientCertificates.Add(userCert);

我正在使用
HTTPWebRequest
访问一个需要客户端证书的页面

我使用以下代码,一切正常

    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(textBox1.Text);

    X509Certificate2 userCert = SelectClientCertificate();
    if (userCert != null) myReq.ClientCertificates.Add(userCert);

    HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
现在是我的问题,因为我的调用
SelectClientCertificate()
显示了一个对话框,允许用户选择证书,如果服务器不要求客户端身份验证,我不想显示该对话框!实际上,我正在寻找Internet Explorer的行为主义。如果访问服务器需要用户客户端身份验证的页面,则会显示证书选择对话框,否则不会显示

我查看了
AuthenticationManager
,但我不确定是否真的需要注册我自己的AuthenticationModule!有什么提示吗


我还检查了403或403.7的
StatusCode
,但目前我正在使用的服务器,如果缺少证书,也会返回200,内容表明我未经授权

为什么要检查服务器想要什么?如果请求通过https运行,只需请求证书即可

如果我记得很清楚的话,服务器对任何人都没有义务。客户机的职责是使用SSL握手开始通信,并且在任何真正的HTTP通信发生之前,客户机/服务器交换其证书。您无法检测服务器是否“要求”您提供证书。如果您尝试与它交谈,如果您没有证书,并且服务器需要证书,服务器将断开连接并保持沉默,或者可能会返回一些随机错误代码

在尝试创建/发送请求之前,您可以尝试提前检测服务器是否尝试进行握手,但您必须在TCP层的下面一层进行此操作。尝试检查描述HTTPS协商的RFC或握手的可行性,也许这会对您有所帮助


或者只是尝试执行HTTP w/o S请求,如果失败,请重新请求证书,然后使用HTTPS重试。我想你的用户会活下来。

嗨,你找到解决这个问题的方法了吗?嗨,如果你有,我也对这个方法感兴趣。我有同样的问题。如果需要,服务器会要求客户端发送证书。检查SSL中的相互身份验证。您的陈述是错误的。这听起来可能有点混乱,因为我混合了一般答案和关于HttpWebRequest类可能实现的提示。要点是,(AFAIR)HWR类不公开任何“I-Demand-A-Certificate”事件或扩展点。您必须在没有证书的情况下运行请求,并为其失败做好准备(即使用证书重试),或者必须在发送第一个请求之前提前提供证书。奇怪的是,同一个HWR类和框架的其余部分为您提供了扩展点,允许您动态地验证服务器的证书。我不理解他们的想法。我想在SslStream类中使用LocalCertificateSelectionCallback。但它并没有在HttpWebRequest类中公开。这是非常有用的发现!在正确的时间到达它可能不容易,因为我们需要在connetion启动后但在它内部通过该步骤之前附加处理程序。我不知道如何从HWReq获取SslStream实例,但我猜它是在启动后延迟创建的。但我很确定,到
RemoteCertificateValidationCallback
的时候,流已经启动并运行了。因此,实际上可以附加一个伪RemCerValiCbk,然后从其中将SslStream从请求实例中破解出来,并连接到LocalCertificateSelectionCallback!