我在ASP.NET Web API 2应用程序中使用客户端证书身份验证。我将证书附加到客户端,如下:
private HttpClient GetHttpClient()
{
HttpClient client = new HttpClient(GetRequestHandler());
client.BaseAddress = new Uri(_apiBaseUrl);
return client;
}
private WebRequestHandler GetRequestHandler()
{
WebRequestHandler wrh = new WebRequestHandler();
X509Certificate cert = GetClientCert();
wrh.ClientCertificates.Add(cert);
return wrh;
}
private X509Certificate GetClientCert()
{
X509Store certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate cert = certStore.Certificates.Find(X509FindType.FindBySubjectName, _certName, false)[0];
certStore.Close();
return cert;
}
当我调试它时,我可以看到cert对象是我所期望的。在服务器上的Web API中,我正在使用它:
public class CertAuthHandler : DelegatingHandler
{
private ICertValidator _certValidator;
public CertAuthHandler(ICertValidator certValidator)
{
this._certValidator = certValidator;
}
public CertAuthHandler() : this(new LoggingCertValidator()) { }
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var cert = request.GetClientCertificate();
if (_certValidator.IsValid(cert))
{
return base.SendAsync(request, cancellationToken);
}
return Task<HttpResponseMessage>.Factory.StartNew(() => request.CreateResponse(HttpStatusCode.Unauthorized));
}
}
这在我们的TEST服务器上完全按预期工作;但是在我们的DEV服务器上,我添加的用于排除故障的日志记录显示request.GetClientCertificate()
返回null。我进行了两次和三次检查,IIS已设置为接受客户端证书;当我将其更改为需要ssl并要求客户端证书时,它返回403.如果重要,则将Web API设置为DEV和TEST中主网站的子应用程序。
我还有一些队友从他们的机器上尝试客户端,以确保它与我的机器上的证书安装方式无关(我们使用不同的DEV和TEST证书);他们也获得了401.我使用相同的DEV证书来调用具有相同安全设置的另一个API,并且它没有问题,所以它似乎是服务器特定的。我的问题是,我可以在DEV服务器上看到什么可能导致证书无法通过请求?我无法在服务器的事件日志中找到与此相关的任何内容,除了我自己添加到API的自定义日志记录。非常感谢任何帮助。