从HTTP请求访问客户端证书

Mas*_*son 9 c# asp.net security x509 mutual-authentication

我正在尝试从HTTP请求访问我的Web API中的客户端证书.我附上证书如下:

X509Certificate2 clientCert = GetClientCertificate();   
HttpWebRequest request  = (HttpWebRequest)WebRequest.Create("https://localhost:44366/test");                        
request.KeepAlive = true;
request.Method = "GET";
request.Accept = "application/json";
request.ClientCertificates.Clear();
request.ClientCertificates.Add(clientCert);
var response = (HttpWebResponse) request.GetResponse();  
Run Code Online (Sandbox Code Playgroud)

在哪里GetClientCertificate()访问本地安装的证书.从我的WebApi内部,我有以下路线:

[HttpGet]
[Route("test")]
public HttpResponseMessage TestNoAuth()
{
    X509Certificate2 cert = Request.GetClientCertificate();
    return cert == null ? Request.CreateResponse(HttpStatusCode.BadRequest, "No cert") : Request.CreateResponse(HttpStatusCode.OK, "Cert attached");
}                                                              
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,cert总会回来null.我是否错误地附加了证书,或者尝试错误地访问它?我已经用这条测试路线创建了一个全新的WebAPI,以确保我们的开发API中没有可能存在冲突的设置.任何帮助将不胜感激.

Cod*_*ler 1

确保您的 web.config 正确设置sslFlags为SslNegotiateCert:

  <system.webServer>
    <security>
        <access sslFlags="SslNegotiateCert" />
    </security>
  </system.webServer>
Run Code Online (Sandbox Code Playgroud)

如果没有此设置,附加到请求的任何证书都将被忽略,请参阅此了解详细信息。

Andras Nemes 撰写了一系列有关在 .NET 中使用客户端证书的精彩文章。在这一章中,详细描述了如何设置客户端证书以供本地测试使用。