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

时间:2012-02-15 13:37:58

标签: 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);

    HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();

现在这是我的问题,因为我的呼叫SelectClientCertificate()显示了一个让用户选择证书的对话框,如果服务器没有要求客户端身份验证,我不想显示对话框!其实我在寻找Internet Explorer的行为主义。如果访问服务器需要用户客户端身份验证的页面,则会显示“证书选择”对话框,否则不会显示!

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

我还检查了StatusCode的403或403.7,但我现在正在使用的服务器,如果缺少证书,也会返回200,内容说我没有被授权!

1 个答案:

答案 0 :(得分:0)

为什么要检查服务器需要什么?请求通过https运行,只需要证书。

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

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

或者只是尝试执行HTTP w / o S请求,如果失败,请重新申请证书并使用HTTPS重试。我认为您的用户将幸免于难。