asp.net 具有客户端证书身份验证的.Net Core Web API

8wigbo56  于 2022-11-19  发布在  .NET
关注(0)|答案(4)|浏览(318)

我在.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");
    }

}

然后安装了一个自签名证书并添加到Trusted Root中,以实现客户端身份验证目的。

但是变量 cert 总是空的,并且当我请求页面时浏览器甚至没有提示我使用证书。
我想是因为我必须在某个地方设置Web服务器必须要求客户端证书,因为它可以在IIS中设置,但在我的开发环境中,我使用的是IIS Express。
如何强制IIS Express请求客户端证书?

30byixjq

30byixjq1#

为了使用ASP.NET核心身份验证堆栈进行正确的证书身份验证,您还可以通过Barry Dorrans自己检查idunno.Authentication.Certificate。它允许您为应用程序启用证书身份验证,并像处理任何其他身份验证方案一样处理它,因此您可以将实际的基于证书的逻辑排除在业务逻辑之外。
这个项目包含了ASP.NET核心的证书身份验证的实现。证书身份验证发生在TLS级别,早在它到达ASP.NET核心之前,所以,更准确地说,这是一个验证证书的身份验证处理程序,然后给你一个事件,你可以在那里将证书解析为ClaimsPrincipal。
您必须为证书身份验证配置您的主机,无论是IIS、Kestrel、Azure Web应用程序还是您正在使用的任何其他主机。
请确保也检查了“documentation”关于如何正确设置它,因为它需要主机的配置才能正常工作,就像你对IIS Express所做的那样。

svgewumm

svgewumm2#

为了使IIS Express能够开始请求客户端证书并将其传递到服务器端,必须编辑配置文件:
整个配置位于.vs\config\applicationhost.config中的解决方案文件夹内
确保设置了以下值:

<security>
   <access sslFlags="Ssl, SslNegotiateCert, SslRequireCert" />

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

plicqrtu3#

对于本地测试,可以从Visual Studio在IIS Express中启用SSL。在“属性”窗口中,将“SSL已启用”设置为True。注意SSL URL的值。使用此URL测试HTTPS连接。
适用于需要Details here的用户

envsm3lx

envsm3lx4#

对于.NET 3.1+,现在有官方软件包支持此功能:

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;
        }
    };
});

服务器端也需要进行配置,请参阅:
https://learn.microsoft.com/en-us/aspnet/core/security/authentication/certauth?view=aspnetcore-6.0

相关问题