asp.net - 具有客户端证书身份验证的 .Net Core Web API
问题描述
我在 .Net Core 2.1 中开发了一个简单的 WEB API 服务
我正在尝试实现客户端证书身份验证,因此我只能将 API 访问权限授予在其机器上安装了特定证书的客户端。
客户端使用浏览器(Chrome、Edge、IE11 或 Firefox)访问 API。
我在 API 方法中添加了证书请求:
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
X509Certificate2 cert = Request.HttpContext.Connection.ClientCertificate;
if (cert!=null && cert.Verify())
{
//more verification here...
return Content("....", "application/json");
}
else
{
return Content("....", "application/json");
}
}
然后我安装了一个自签名证书并添加到受信任的根目录中,从而启用客户端身份验证目的。
但是变量cert始终为空,当我请求页面时,浏览器甚至没有提示我使用证书。
我想是因为我必须在某个地方设置 Web 服务器必须请求客户端证书,因为可以在 IIS 中设置,但在我的开发环境中,我使用的是 IIS Express。
如何强制 IIS express 请求客户端证书?
解决方案
要使用 ASP.NET Core 身份验证堆栈进行正确的证书身份验证,您还可以查看Barry Dorrans本人的idunno.Authentication.Certificate。它允许您为应用程序启用证书身份验证并像处理任何其他身份验证方案一样处理它,因此您可以将实际的基于证书的逻辑排除在业务逻辑之外。
这个项目类型包含ASP.NET Core的证书身份验证的实现。证书身份验证发生在 TLS 级别,早在它到达 ASP.NET Core 之前,因此,更准确地说,这是一个身份验证处理程序,它验证证书,然后为您提供一个事件,您可以在其中将该证书解析为 ClaimsPrincipal。
您必须配置您的主机以进行证书身份验证,无论是 IIS、Kestrel、Azure Web 应用程序还是您正在使用的其他任何东西。
确保还查看有关如何正确设置的“文档”</a>,因为它需要配置主机才能正常工作,就像您使用 IIS Express 所做的那样。包括原始 Kestrel、IIS、Azure 或一般反向代理等其他服务器的说明。
推荐阅读
- c# - if 语句自行清除面板中的控件
- docker - 有没有办法从同一网络上的另一台计算机 ssh 到 docker 机器
- java - Java中的异常和数组问题
- powershell - 带通配符的变量
- python - 如何过滤列表中出现在同一列表python中较长元素中的字符串元素?
- arrays - Python/curve_fit:无法通过初始化猜测传递数组
- java - 为什么我在使用带有片段的 RecyclerView 时不断收到空引用错误
- java - 为什么按任意键方法不会循环停止?
- delphi - Delphi 10.3:找不到所需的包
- python - TypeError:级别类型不匹配:0.2。将数据拆分为训练、验证和测试集时