- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 .NET4.5 WebAPI 2 应用程序,它使用 SSL 客户端证书进行一些自定义安全相关检查。
在调试应用程序时,request.GetClientCertificate()
为任何服务调用返回 null
,无论我目前尝试了什么。
测试代码:
基本上,在我的服务端,我有一个类似这样的方法:
class CertificateChecker : ICertificateChecker
{
public bool Check(HttpRequestMessage request)
{
var cert = request.GetClientCertificate();
}
}
我使用 request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert)
使用附加到请求的客户端证书进行单元测试通过(证书完全符合预期,验证有效,等等).
但是,当我使用调用实际 WebAPI 应用程序的 HttpClient
进行测试时,断点设置在服务端的 request.GetClientCertificate()
行,同一行返回 null。
这是我尝试过的:
客户端证书:
(基本上,关注了https://www.piotrwalat.net/client-certificate-authentication-in-asp-net-web-api-and-windows-store-apps/和类似的博客)
在我使用 HttpClient
调用服务的测试中,通过以下方式附加了客户端证书(均无效):
使用 WebRequestHandler
,将 ClientCertificateOptions
设置为 Manual,并将证书添加到 ClientCertificates
集合。
using (var handler = new WebRequestHandler())
{
var cert = GetTestCert();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(cert);
// and so on...
}
使用 HttpRequestMessage
,将证书添加为属性,并将键设置为 HttpPropertyKeys.ClientCertificateKey
(此方法适用于如上所述的单元测试)。
request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert);
在这两种情况下,cert
变量都设置为预期的 X509Certificate2
对象。
托管:
IISExpress:尝试在 IISExpress 中运行应用。
编辑 applicationhost.config 并启用 iisClientCertificateMappingAuthentication
设置为“true”和以下访问设置(均无效):
<access sslFlags="Ssl, SslNegotiateCert" />
<access sslFlags="SslNegotiateCert" />
本地 IIS将 Web 应用程序设置为在本地计算机上的 IIS 中运行
Ssl、SslNegotiateCert
和 SslNegotiateCert
)(通过配置编辑器)在这两种情况下,当使用网络浏览器通过 https url 访问网络 api 时,我可以毫无问题地显示家庭 Controller 的索引 View (因此,服务器端证书是可信的)。
最佳答案
我知道它有点旧,但我遇到了同样的问题,我通过关注这篇文章解决了它:
https://improveandrepeat.com/2017/07/how-to-configure-iis-express-to-accept-ssl-client-certificates/
问题是 IIS 服务器上的配置,也可以在 IIS express 上修改。我报告它以防链接不可用。
For IIS change the server configuration file, for IIS Express modify the file under your solution located in .vs\config\applicationhost.config
Search for an xml element called inside a element:
<security>
<access sslFlags="None" />The default configuration has no support for SSL client certificates. You need to modify the sslFlags attribute to include these options: Ssl, SslNegotiateCert, SslRequireCert
<security>
<access sslFlags="Ssl, SslNegotiateCert, SslRequireCert" />The next step is to find the element :
<iisClientCertificateMappingAuthentication enabled="false"></iisClientCertificateMappingAuthentication>
If you change enabled to true, IIS Express will start accepting client certificates:
<iisClientCertificateMappingAuthentication enabled="true">
</iisClientCertificateMappingAuthentication>You now need to restart Visual Studio and IIS Express. IIS Express can be restarted using the icon in your system tray.
From now on you will be asked for a client certificate and you can debug the whole application inside Visual Studio. This may not look like a big improvement, but trust me, it makes debugging much simpler.
希望这可以帮助其他人:-)
关于c# - HttpRequestMessage.GetClientCertificate() 在 Web API 中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817965/
我正在尝试发送 json “样式”字符串通过 HttpResponseMessage . 我创建了以下方法,希望能够成功发送响应消息。 class Foo { /// /// Ven
我有一个 Controller Action : [HttpPost] [EnableQuery] [ODataRoute("PostData")] public async Task PostDat
我的任务是整合 Amazon Gift Codes On Demand (AGCOD)安静的 API。我们需要使用 Signature Version 4 签署我们的请求,由他们执行的操作 AWS S
我有一个向服务器发送 POST 请求的方法。该请求在 HttpRequestMessage 对象中定义。 然而,如果服务器返回一些可重试错误,我想重试,如下面的代码: using (var reque
我正在尝试使用此答案中概述的方法克隆请求: https://stackoverflow.com/a/18014515/406322 但是,如果原始请求有内容,我会得到一个 ObjectDisposed
在 winrt 中是否有任何内置函数将摘要身份验证与 HttpRequestMessage 相关联?还是我必须使用其他类才能执行此任务? 谢谢。 最佳答案 我正在使用 HttpClient对于 Htt
我正在尝试发送一个将其用户代理设置为带有冒号的内容的请求,但是 HttpRequestMessage提示冒号是无效字符。 确切的代码看起来像这样: HttpClient client = new Ht
假设我有一个像这样构建的 HttpRequestMessage 对象: var request = new HttpRequestMessage(HttpMethod.Post, uploadUrl)
我在 ASP.NET Core 中有一个 Web API,该方法具有以下签名: [HttpPost] public HttpResponseMessage Foo(HttpRequestMessage
我有两个 API Controller ,位于两个不同的文件夹中,它们具有 GetEvents() 操作: V1 EventsController V2 EventsController 我希
我刚刚读到关于 web API model validation 的内容它有这个示例,但是下面提供的示例代码将无法编译,因为 CreateErrorResponse() 不存在于 HttpReques
将 http web api 请求转发到另一台服务器的最佳方法是什么? 这是我正在尝试的: 我有一个 .NET 项目,当我收到某些 API 请求时,我想修改请求,将其转发到另一台服务器,然后返回第二台
我正在处理一个 API,该 API 需要我设置 header application/json;masked=false 才能隐藏一些信息。使用 设置标题时 var request = new Htt
这里我有一个 HttpRequestMessage,我正在尝试向它添加一个客户端证书,但似乎找不到如何执行此操作。有没有人做过这样的事情? HttpRequestMessage request = n
有人有序列化 HttpRequestMessage 对象的经验吗?尝试使用 Json.net,它部分有效。也就是说,JsonConvert.DeserializeObject 由于构造问题而失败 St
我想多次发送完全相同的请求,例如: HttpClient client = new HttpClient(); HttpRequestMessage req = new HttpRequestMess
HttpRequestMessage.Properties的目的是什么? ? 我想知道它是否为我的应用程序提供了一些有用的东西。 最佳答案 在 Web Api 中它包含一些特殊的标志:http://w
我有一个具有以下操作的 MVC API Controller 。 我不明白如何阅读消息的实际数据/正文? [HttpPost] public void Confirmation(HttpRequest
如何将 IP 地址添加到 HttpRequestMessage? 我正在为 Web.API 应用程序编写单元测试,我有一个 AuthorizeAttribute 来检查调用者的 IP 地址 -
我实现了 POST Rest 服务来将文件上传到我的服务器。我现在遇到的问题是我想按类型限制上传的文件。举例来说,我只想允许上传 .pdf 文件。 我试图做的是 Task ta
我是一名优秀的程序员,十分优秀!