Я создаю небольшую функцию проверки подлинности сертификата ASP.NET Core, как указано в официальные документы.
Примечание. Я не создаю API, я просто пытаюсь защитить некоторые методы действий некоторых контроллеров, чтобы эти защищенные методы действий открывались только тогда, когда у клиента есть сертификат клиента. .
На изображении ниже показано, что я могу защитить метод Index action, для которого теперь требуется сертификат клиента. Другой метод действия, который называется «Конфиденциальность», не требует сертификата клиента. В результате действие Index открывается в браузере (получается ошибка 403), но действие Privacy открывается в браузере.
Полные коды
<сильный>1. Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureKestrel(o =>
{
o.ConfigureHttpsDefaults(o =>
o.ClientCertificateMode =
ClientCertificateMode.RequireCertificate);
});
});
<сильный>2. Startup.cs
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAuthentication(
CertificateAuthenticationDefaults.AuthenticationScheme)
.AddCertificate(options =>
{
options.Events = new CertificateAuthenticationEvents
{
OnCertificateValidated = context =>
{
var validationService = context.HttpContext.RequestServices.GetService<MyCertificateValidationService>();
if (validationService.ValidateCertificate(context.ClientCertificate))
{
context.Success();
}
else
{
context.Fail("invalid cert");
}
return Task.CompletedTask;
},
OnAuthenticationFailed = context =>
{
context.Fail("invalid cert");
return Task.CompletedTask;
}
};
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCertificateForwarding();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
<сильный>3. MyCertificateValidationService.cs
public class MyCertificateValidationService
{
public bool ValidateCertificate(X509Certificate2 clientCertificate)
{
var cert = new X509Certificate2(Path.Combine("localhost_root_l1.pfx"), "1234");
if (clientCertificate.Thumbprint == cert.Thumbprint)
{
return true;
}
return false;
}
}
<сильный>4. Защищенные и незащищенные методы действий
[Authorize]
public IActionResult Index()
{
return View();
}
public IActionResult Privacy()
{
return View();
}
Примечание. Метод действия Index требует аутентификации клиента, в то время как Privacy не требует сертификата клиента.
Проблемы. Проблемы, с которыми я сталкиваюсь:
CertificateAuthenticationEvents
иOnAuthenticationFailed
расположены вConfigureServices()
методе файла startup.cs, который я не вызывал. Я проверил их, поставив точки останова, но точка останова не достигнута.Метод MyCertificateValidationService.cs класса
ValidateCertificate()
также не вызывается. Я также проверил это с помощью точки останова
Пожалуйста, помогите мне реализовать авторизацию сертификата.
Обновить
Я создал 2 сертификата на С# как объяснено в этом руководстве. Эти:
- Корневой сертификат с именем root_localhost.pfx
- Сертификат клиента с именем client.pfx
Я сделал 2 вещи с этими сертификатами:
а. Я добавил root_localhost.pfx в доверенные корневые центры сертификации (в Windows) для локального компьютера (с помощью CertManager).
б. Я импортировал сертификат клиента в браузере Chrome.
Затем я выбрал проект в VS 2019 (консоль) вместо «IIS Express» и запустил свой проект. Я открыл URL-адрес веб-сайта в окне инкогнито, URL-адрес - https://localhost:5001
Chrome предлагает выбрать сертификат, см. изображение ниже:
При выборе этого я получаю Этот сайт недоступен - ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, см. изображение ниже:
Почему это происходит????