Я создаю небольшую функцию в ASP. NET Проверка подлинности основного сертификата, как указано в официальных документах .
Примечание: Я не строю API, я просто пытаюсь защитить некоторые методы Action некоторых контроллеров, чтобы эти защищенные методы действия открывались только тогда, когда клиент имеет сертификат клиента.
На рисунке ниже показано, что я могу защитить метод 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();
}
Примечание : метод действия индекса требует аутентификации клиента, тогда как для конфиденциальности не требуется сертификат клиента.
Проблемы: Проблемы, с которыми я сталкиваюсь:
CertificateAuthenticationEvents
& OnAuthenticationFailed
, расположенный в ConfigureServices()
методе файла startup.cs Я не звонила. Я проверил их, установив точки останова, но точка останова не достигнута.
MyCertificateValidationService.cs class ValidateCertificate()
метод также не вызывается. Я также проверил это с точкой останова
Пожалуйста, помогите мне реализовать авторизацию сертификата.
Обновление
Я создал 2 сертификата в C#, как объяснено в этом уроке 1079 *. Это:
- Root сертификат с именем root_localhost.pfx
- Сертификат клиента с именем client.pfx
Я сделал 2 вещи с этими сертификаты:
а. Я добавил root_localhost.pfx в доверенные Root центры сертификации (на Windows) для локального компьютера (используя CertManager).
b. Я импортировал сертификат клиента в браузере chrome.
Затем я выбрал проект в VS 2019 (консоль) вместо 'IIS Express' и запустил свой проект. Я открыл URL-адрес веб-сайта в окне инкогнито, URL-адрес: https://localhost: 5001
Chrome просит выбрать сертификат, см. Изображение ниже:
При выборе я получаю Этот сайт не доступен - ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY , см. Изображение ниже:
Почему это происходит ????