简体   繁体   English

如何使用 .NET Core 3.0 在 App-Service 中启用证书身份验证?

[英]How to enable certificate authentication in App-Service with .NET Core 3.0?

I am implementing client authentication with certificates to access my API.我正在使用证书实现客户端身份验证以访问我的 API。 I followed the documentation from Microsoft https://docs.microsoft.com/en-us/aspnet/core/security/authentication/certauth?view=aspnetcore-3.0我遵循了 Microsoft https://docs.microsoft.com/en-us/aspnet/core/security/authentication/certauth?view=aspnetcore-3.0的文档

My problem is, that I never receive an client cert.我的问题是,我从未收到客户证书。 I tested it locally and on Azure as well.我在本地和 Azure 上对其进行了测试。

I have tried several variations, but with same result.我尝试了几种变体,但结果相同。

Excerpst from my Startup class:摘自我的启动 class:

// Register Certificate Authentication
            //services.AddCertificateForwarding(options => options.CertificateHeader = "X-ARR-ClientCert");
            services.AddCertificateForwarding(options =>
            {
                options.CertificateHeader = "X-ARR-ClientCert";
                options.HeaderConverter = (headerValue) =>
                {
                    X509Certificate2 clientCertificate = null;
                    if (!string.IsNullOrWhiteSpace(headerValue))
                    {
                        byte[] bytes = System.Text.Encoding.ASCII.GetBytes(headerValue);
                        clientCertificate = new X509Certificate2(bytes);
                    }

                    return clientCertificate;
                };
            });


            services.AddSingleton<CertificateValidationService>();

            services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
                .AddCertificate(options =>
                {
                    options.AllowedCertificateTypes = CertificateTypes.All;
                    options.Events = new CertificateAuthenticationEvents
                    {
                        OnCertificateValidated = context =>
                        {
                            var validationService =
                                context.HttpContext.RequestServices.GetService<CertificateValidationService>();

                            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();
                            }
                            else
                            {
                                context.Fail("invalid cert");
                            }

                            return Task.CompletedTask;
                        },

                        OnAuthenticationFailed = context =>
                        {
                            context.Fail("invalid cert");
                            return Task.CompletedTask;
                        }

                    };
                });

and

app.UseCertificateForwarding();
app.UseAuthentication();

in Program.cs I added this config:在 Program.cs 我添加了这个配置:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
                webBuilder.ConfigureKestrel(options =>
                {
                    options.ConfigureHttpsDefaults(opt =>
                    {
                        opt.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
                    });

                });
            });

Remove the header converter when calling AddCertificateForwarding调用 AddCertificateForwarding 时移除 header 转换器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM