我需要在 .NET 5 Web API 中的某些端点上实现客户端证书身份验证。因此,我不想在所有端点上启用 HTTPS,如 here in the MS docs 中所述。 。我在本地计算机上使用 Kestrel,而不是 IIS Express 或 IIS。
我尝试了以下三种方法,但都没有成功:
var clientCertHeaders = context.HttpContext.Request.Headers;
此返回请求的正常 header ,但不返回证书。
var clientCert = context.HttpContext.Connection.ClientCertificate;
var clientCertAsync = context.HttpContext.Connection.GetClientCertificateAsync().Result;
这两个都返回 null。
我已尝试将以下内容应用到我的服务中:
services.AddCertificateForwarding(options =>
{
options.CertificateHeader = "X-SSL-CERT";
options.HeaderConverter = (headerValue) =>
{
X509Certificate2 clientCertificate = null;
if(!string.IsNullOrWhiteSpace(headerValue))
{
var bytes = Encoding.UTF8.GetBytes(headerValue);
clientCertificate = new X509Certificate2(bytes);
}
return clientCertificate;
};
});
即使在我的服务中启用了该功能,我也无法检索客户端证书。
我正在使用 Postman 向 API 请求发出请求。
最佳答案
您需要将 Kestrel 配置为允许在 program.cs
中使用客户端证书。默认值为 ClientCertificateMode.NoCertificate
,因此在您的 ConfigureWebHostDefaults
中需要将其更改为 ClientCertificateMode.AllowCertificate
。
这是您发送给我的文档中经过编辑的代码块:
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureKestrel(o =>
{
o.ConfigureHttpsDefaults(o =>
o.ClientCertificateMode =
ClientCertificateMode.AllowCertificate);
});
});
}
关于c# - 获取客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67193225/