gpt4 book ai didi

c# - ASP.NET Core 3.1 中的证书认证实现

转载 作者:行者123 更新时间:2023-12-04 11:32:07 26 4
gpt4 key购买 nike

我正在 ASP.NET Core 证书身份验证中构建一个小功能,如 official docs 中所述.

注:我不是在构建 API,我只是想保护某些 Controller 的某些 Action 方法,以便仅当客户端具有客户端证书时才打开这些安全的操作方法。

The below image shows that I am able to secure the Index action method which now requires client certificate. Other action method which is Privacy does not require client certificate. The result is that Index action does opens in browser (403 error is received) but Privacy action is opened up in browser



enter image description here

完整代码

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.安全和不安全的 Action 方法
[Authorize]
public IActionResult Index()
{
return View();
}

public IActionResult Privacy()
{
return View();
}

备注 :索引操作方法需要客户端身份验证,而隐私不需要客户端证书。

问题:
我遇到的问题是:
  • CertificateAuthenticationEvents & OnAuthenticationFailed位于 ConfigureServices() startup.cs 文件的方法我没有调用。我通过放置断点来检查它们,但未达到断点。
  • MyCertificateValidationService.cs 类 ValidateCertificate()方法也没有被调用。我也用断点检查过它

  • 请帮助我实现证书授权。

    Update



    我在 C# 中创建了 2 个证书作为 explained in this tutorial .这些是:
  • 名为 root_localhost.pfx 的根证书
  • 名为 client.pfx 的客户端证书

  • I did 2 things with these certificates:



    一种。我将 root_localhost.pfx 添加到本地计算机(使用 CertManager)的受信任根证书颁发机构(在 Windows 上)。

    湾我通过 chrome 浏览器导入了客户端证书。

    接下来,我在 VS 2019(控制台)而不是“IIS Express”中选择了项目并运行我的项目。我在隐身窗口中打开网站网址,网址恰好是 - https://localhost:5001

    Chrome 要求选择证书,见下图:
    enter image description here

    On selecting it i get This site can’t be reached - ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, see below image:



    enter image description here

    为什么会发生????

    最佳答案

    目前您的应用程序未配置为使用客户端证书。原因是您在 IIS Express 中启动(托管)您的应用程序。有2个选项:

    1)最简单的,切换到Project模式运行(app会在console窗口运行)。您也可以在控制台中手动运行它。

    2) 稍微复杂一点的方法是配置您的 IIS Express 以使用客户端证书。按照以下步骤:
    2.1) 编辑\config\applicationhost.config 文件并更改下面的部分(更改 - 拒绝为允许)。

          <sectionGroup name="security">
    <section name="access" overrideModeDefault="**Allow**" />
    <section name="applicationDependencies" overrideModeDefault="Deny" />
    <sectionGroup name="authentication">
    <section name="anonymousAuthentication" overrideModeDefault="**Allow**" />

    2.2) 在你的项目中添加以下文件 web.config
    <configuration>
    <system.webServer>
    <security>
    <access sslFlags="Ssl,SslNegotiateCert,SslRequireCert" />
    <authentication>
    <anonymousAuthentication enabled="true" />
    </authentication>
    </security>
    </system.webServer>
    </configuration>

    下一个:

    客户端身份验证工作的先决条件是拥有客户端证书。
    您可以使用以下命令或任何其他生成客户端证书的方法创建自签名:
    #create key
    openssl req -newkey rsa:4096 -keyout key.pem -out csr.pem -nodes -days 365 -subj "/CN=Your name"
    #create certificate
    openssl x509 -req -in csr.pem -signkey key.pem -out cert.pem -days 365
    #self sign it
    openssl pkcs12 -export -in cert.pem -inkey key.pem -out your_cert.p12


    由于此证书是自签名的,因此您必须将其添加到本地计算机的受信任根证书颁发机构(在 Windows 上)(使用 CertManager)。

    之后,您需要使用相同的 CertManager 将其安装(导入)到您的个人证书存储中,但仅适用于当前用户。替代方法是使用 Chrome 设置(“管理证书”)。这是 Chrome 能够将证书发送到服务器所必需的。

    同样在您的应用程序中,您可以更改此选项以允许自签名证书。
                services.AddAuthentication(
    CertificateAuthenticationDefaults.AuthenticationScheme)
    .AddCertificate(options =>
    {
    **options.AllowedCertificateTypes = CertificateTypes.All**;

    在所有这些更改之后,它应该要求在您访问您的站点时选择证书。

    提示:如果您再次访问同一页面,则可能不会要求您选择要使用的证书,直到您关闭所有 chrome 实例。如果您希望它要求选择要使用的证书,请打开一个新的隐身窗口。

    关于c# - ASP.NET Core 3.1 中的证书认证实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60477579/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com