使用客户端证书身份验证的 .Net Core Web API

12

我在 .Net Core 2.1 中开发了一个简单的 WEB API 服务。

我正在尝试实现客户端证书认证,以便只授予具有特定证书安装在其机器上的客户端访问API的权限。

客户端使用浏览器(Chrome、Edge、IE11或Firefox)访问API。

我已在API方法中添加了请求证书的代码:

[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{

    X509Certificate2 cert = Request.HttpContext.Connection.ClientCertificate;
    if (cert!=null && cert.Verify())
    {
        //more verification here...
        return Content("....", "application/json");
    }
    else
    {
        return Content("....", "application/json");
    }

}

然后我安装了自签名证书并添加到受信任的根证书中,以启用客户端身份验证。

enter image description here

但是变量cert始终为空,并且浏览器甚至没有提示我在请求页面时使用证书。

我想这是因为我必须在某个地方设置Web服务器必须要求客户端证书,正如在IIS中可以设置的那样,但在我的开发环境中,我使用的是IIS Express。

我该如何强制IIS Express请求客户端证书?


1
浏览器不关心Windows的受信任根证书,它们有自己的列表,但是本地运行的IIS会关心。 - alcoforado
看起来证书需要从CurrentUser/My路径中读取。如果我在这里错了,请纠正我。 - alcoforado
4个回答

6

为了使用ASP.NET Core身份验证堆栈进行适当的证书身份验证,您还可以查看idunno.Authentication.Certificate,作者是Barry Dorrans。它允许您为应用程序启用证书身份验证,并像任何其他身份验证方案一样处理它,因此您可以将实际基于证书的逻辑保留在业务逻辑之外。

这个项目包含了一个ASP.NET Core的证书身份验证实现。证书身份验证发生在TLS级别,早于它到达ASP.NET Core,因此更准确地说,这是一个验证证书并给您提供事件以将该证书解析为ClaimsPrincipal的身份验证处理程序。

您必须配置您的主机以进行证书身份验证,无论是IIS、Kestrel、Azure Web Applications还是其他任何您正在使用的内容。

请务必查看{{link1:“文档”}},了解如何正确设置,因为它需要主机配置才能正常工作,就像你使用IIS Express一样。其他服务器的说明,如原始Kestrel、IIS、Azure或通用反向代理也已包含在内。


3
为了使IIS Express启动请求客户端证书并将其传递到服务器端,必须编辑配置文件:
整个配置文件位于解决方案文件夹中的.vs\config\applicationhost.config中。
确保设置以下值:
<security>
   <access sslFlags="Ssl, SslNegotiateCert, SslRequireCert" />

并且

<iisClientCertificateMappingAuthentication enabled="true"></iisClientCertificateMappingAuthentication>

2
你好,在我的情况下,在更改了 .vs\config\applicationhost.config 后,调试根本无法启动 - VS 显示错误: “无法启动进程 C:\program files\dotnet\dotnet.exe。Web 服务器请求失败,状态代码为 403。禁止。” 而 IIS express 也是如此。 - Vitaliy Markitanov

1

对于本地测试,您可以从Visual Studio中启用IIS Express中的SSL。在“属性”窗口中,将“SSL Enabled”设置为True。注意SSL URL的值;使用此URL进行测试HTTPS连接。

对于需要了解详细信息的人,请参阅此处的详细信息


1

对于 .NET 3.1+,现在有官方的包支持此功能。但请注意,服务器端也需要进行配置。

来自 在 ASP.NET Core 中配置证书身份验证

证书身份验证发生在 TLS 级别,早于到达 ASP.NET Core。更准确地说,这是一个验证证书并为您提供可以将该证书解析为 ClaimsPrincipal 的事件的身份验证处理程序。

您必须为证书身份验证配置服务器,无论是 IIS、Kestrel、Azure Web Apps 还是其他任何您使用的内容。

代码

builder.Services
   .AddAuthentication(
        CertificateAuthenticationDefaults.AuthenticationScheme)
   .AddCertificate(options =>
    {
      options.Events = new CertificateAuthenticationEvents
      {
        OnCertificateValidated = context =>
        {
          var validationService = context.HttpContext.RequestServices
                    .GetRequiredService<ICertificateValidationService>();
          if (validationService.ValidateCertificate(context.ClientCertificate))
          {
            var claims = new[]{
              new Claim(ClaimTypes.NameIdentifier,
                   context.ClientCertificate.Subject,
                   ClaimValueTypes.String, context.Options.ClaimsIssuer),
              new Claim(ClaimTypes.Name,
                   context.ClientCertificate.Subject,
                   ClaimValueTypes.String, context.Options.ClaimsIssuer)
          };

          context.Principal = new ClaimsPrincipal(
                        new ClaimsIdentity(claims, context.Scheme.Name));
          context.Success();
        }
        return Task.CompletedTask;
      }
    };
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接