【发布时间】:2020-03-01 17:07:31
【问题描述】:
我正在 ASP.NET Core 证书身份验证中构建一个小功能,如 official docs 中给出的。
注意:我不是在构建 API,我只是想保护一些控制器的一些 Action 方法,以便这些安全的 action 方法只有在客户端有客户端证书。
下图显示我能够确保索引操作 现在需要客户端证书的方法。其他动作方法 这是隐私不需要客户端证书。结果是 该索引操作确实在浏览器中打开(收到 403 错误)但是 在浏览器中打开隐私操作
完整代码
1.程序.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位于我未调用的 startup.cs 文件的ConfigureServices()方法上。我通过放置断点来检查它们,但没有达到断点。MyCertificateValidationService.cs 类
ValidateCertificate()方法也没有被调用。我也用断点检查过
请帮我实现证书授权。
更新
我在 C# 中创建了 2 个证书为 explained in this tutorial。它们是:
- 名为 root_localhost.pfx 的根证书
- 名为 client.pfx 的客户端证书
我用这些证书做了两件事:
一个。我将 root_localhost.pfx 添加到本地计算机的受信任的根证书颁发机构(在 Windows 上)(使用 CertManager)。
b.我通过 chrome 浏览器导入了客户端证书。
接下来,我选择了 VS 2019(控制台)中的项目而不是“IIS Express”并运行我的项目。我在隐身窗口打开网址,网址恰好是-https://localhost:5001
选择它时,我得到 无法访问此站点 - ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY,见下图:
为什么会这样????
【问题讨论】:
-
您是否已将浏览器配置为使用客户端证书?
标签: c# asp.net asp.net-core asp.net-core-mvc asp.net-core-3.1