c# - 获取客户端证书

标签 c# asp.net-core .net-5

我需要在 .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/

相关文章:

c# - 将 TDelegate 作为事件的通用接口(interface)?

javascript - @Url.Content ("~/") 无法在 JavaScript 文件中工作?

c# - 从本地文本文件读取到 C#?

c# - 如何在 ASP.NET Core 中使用 HttpContextAccessor 读取 URI 参数

c# - 传递给 HttpContext.SignInAsync 和 CookieAuthenticationOptions.ExpireTimeSpan 的时间之间的差异

c# - 有没有办法在 Actions 中选择 Newtonsoft.json 和 System.Text.Json?

c# - 50GB HttpRuntime.Cache 持久化可能吗?

c# - User.IsInRole() 返回 false 并且授权角色给我拒绝访问

c# - 使用 async/await 快速处理队列

c# - .NetFramework 4.8 和 .Net 5 之间的垃圾收集行为差异