Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取客户端证书_C#_Asp.net Core_.net 5 - Fatal编程技术网

C# 获取客户端证书

C# 获取客户端证书,c#,asp.net-core,.net-5,C#,Asp.net Core,.net 5,我需要在.NET5WebAPI中的一些端点上实现客户端证书身份验证。所以我不想像前面所描述的那样在所有端点上启用HTTPS。我在本地机器上使用Kestrel,而不是IIS express或IIS 我尝试过以下三种方法,但都没有成功: var clientCertHeaders = context.HttpContext.Request.Headers; 这个函数返回请求的正常头,但不返回证书 var clientCert = context.HttpContext.Connection.Cli

我需要在.NET5WebAPI中的一些端点上实现客户端证书身份验证。所以我不想像前面所描述的那样在所有端点上启用HTTPS。我在本地机器上使用Kestrel,而不是IIS express或IIS

我尝试过以下三种方法,但都没有成功:

var clientCertHeaders = context.HttpContext.Request.Headers;
这个函数返回请求的正常头,但不返回证书

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;
        };
    });
即使在我的服务中启用了该功能,我也不会检索客户端证书

var clientCert = context.HttpContext.Connection.ClientCertificate;
var clientCertAsync = context.HttpContext.Connection.GetClientCertificateAsync().Result;

我正在使用Postman向API请求发出请求。

您需要配置Kestrel以允许
程序中的客户端证书。cs
默认值为
ClientCertificateMode.NoCertificate
,因此在
配置WebHostDefaults
中,您需要将其更改为
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);
            });
        });
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)
{
返回Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
webBuilder.ConfigureKestrel(o=>
{
o、 配置HttpSDEFULTS(o=>
o、 ClientCertificateMode=
客户证书模块、许可证);
});
});
}

在IIS的链接上,SSL设置有三个选项1)忽略2)接受3)需要。您可以使用选项2。工作完美!非常感谢。