dol*_*mir 8 c# iis ssl-certificate iis-express asp.net-web-api
我有一个.NET4.5 WebAPI 2应用程序,它使用SSL客户端证书进行一些自定义安全相关检查.
在调试应用程序时,无论我到目前为止尝试了什么,都会request.GetClientCertificate()返回null任何服务调用.
经测试的代码:
基本上,在我的服务方面,我有一个类似这样的方法:
class CertificateChecker : ICertificateChecker
{
public bool Check(HttpRequestMessage request)
{
var cert = request.GetClientCertificate();
}
}
Run Code Online (Sandbox Code Playgroud)
我的单元使用request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert)传递附加到请求的客户端证书进行测试(证书完全符合预期,验证工作,等等).
但是,当我使用HttpClient调用实际WebAPI应用程序的测试时,断点设置在request.GetClientCertificate()服务端的行上,同一行返回null.
这是我试过的:
客户证书:
(基本上,按照https://www.piotrwalat.net/client-certificate-authentication-in-asp-net-web-api-and-windows-store-apps/和类似的博客)
在我使用调用服务的测试中,通过HttpClient以下方式附加客户端证书(没有一个工作):
使用WebRequestHandler与ClientCertificateOptions设置为手动,并添加到该证书ClientCertificates集合.
using (var handler = new WebRequestHandler())
{
var cert = GetTestCert();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(cert);
// and so on...
}
Run Code Online (Sandbox Code Playgroud)使用HttpRequestMessage,将cert添加为具有密钥集的属性HttpPropertyKeys.ClientCertificateKey(此方法在如上所述的单元测试时起作用).
request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert);
Run Code Online (Sandbox Code Playgroud)在两种情况下,cert变量都设置为预期X509Certificate2对象.
主机:
IISExpress:试图在IISExpress中运行该应用程序.
编辑applicationhost.config并iisClientCertificateMappingAuthentication enabled设置为"true"和以下访问设置(两者都不起作用):
<access sslFlags="Ssl, SslNegotiateCert" />
<access sslFlags="SslNegotiateCert" />
Run Code Online (Sandbox Code Playgroud)本地IIS将Web应用程序设置为在本地计算机上的IIS中运行
Ssl, SslNegotiateCert和SslNegotiateCert)(通过配置编辑器)在这两种情况下,当使用Web浏览器通过https url访问web api时,我得到家庭控制器的索引视图以显示没有问题(因此,服务器端证书是可信的).
关于您的问题的详细信息。
我假设问题在于使用 HttpClient 附加客户端证书,因为在这种情况下您无法在服务器端查看证书。所有托管和服务器端证书配置听起来都不错。
我将确保X509Certificate2 cert您附加的变量是本地证书存储中存在的公钥(我不确定您将其存储在哪个存储位置)(您可以使用 mmc.exe 检查)。还要确保公钥有一个私钥,因为 HttpClient 需要它来签署请求。
在您的代码片段中,您的using (var handler = new WebRequestHandler())代码位于其余代码之前。确保您也在HttpClient client = new HttpClient(handler)使用中构建您的,否则处理程序将被丢弃。
否则,处理程序的创建看起来不错。
祝你好运!
| 归档时间: |
|
| 查看次数: |
8275 次 |
| 最近记录: |