I am working on client certificate-based authentication with self-hosted web API but web API always return null when trying to get a certificate from the request using GetRequestContext().ClientCertificate
Here is code on web API side
protected override System.Threading.Tasks.Task<HttpResponseMessage>
SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = ValidateCertificate(request);
if (response.StatusCode == HttpStatusCode.OK)
return base.SendAsync(request, cancellationToken);
else
return Task<HttpResponseMessage>.Factory.StartNew(() => response);
}
private HttpResponseMessage ValidateCertificate(HttpRequestMessage request)
{
var certificateFromRequest = request.GetRequestContext().ClientCertificate;
if (certificateFromRequest == null)
{
return request.CreateResponse(HttpStatusCode.NotAcceptable, "Certificate is not available in request!");
}
On Client side code is:
WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = ConfigurationManager.AppSettings["MSIClientCertificateThumbprint"].CleanThumbprint().GetCertByThumbprint();
handler.ClientCertificates.Add(certificate);
using (var httpClient = new HttpClient(handler))
{
var response = await httpClient.PostAsync($"{ConfigurationManager.AppSettings["WEBAPIPATH"]}/api/controller/{param}", null);
response.EnsureSuccessStatusCode();
}
I always see certificate is being properly passed in the HTTPClient with private keys on it but still, web API fails to find it