如果 WebClient 将证书添加到 request.ClientCertificates,是否会在 Web 应用程序的 context.Request.ClientCertificate 处找到该证书?
If WebClient adds a cert to request.ClientCertificates will the cert be found at context.Request.ClientCertificate in the web app?
我的客户端代码使用 WebClient
并将证书附加到 ClientCertificates
:
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
var x509 = GetMyCert(); // see note
request.ClientCertificates.Add( x509 );
return request;
}
注意:我已经检查了调试器,变量 x509
在代码的此时确实包含一个有效的证书对象。
这不是将证书添加到 HttpWebRequest 以供网络应用程序使用的正确方法吗?
服务器端,证书未显示在 IHttpHandler
的 ProcessRequest
方法中:
context.Response.Clear();
// set some Response caching parameters here <snip>
HttpClientCertificate cert = context.Request.ClientCertificate;
if (cert.IsPresent)
{
Hooray();
}
else
{
BooHoo(); // we are here
}
web.config
设置为接受客户端证书:
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
</security>
</system.webServer>
Web应用配置不完整?
P.S。如果我将回调添加到覆盖的 GetWebRequest
方法:
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate (Object obj, X509Certificate X509certificate, X509Chain chain,
System.Net.Security.SslPolicyErrors errors)
{
return (errors == SslPolicyErrors.None);
};
errors
是 SslPolicyErrors.None
和回调 returns true
。但据我所知,我没有在服务器上创建任何策略,除非有某种默认设置。
证书未显示在 HttpContext 中的原因是 client-side 和 server-side 之间的证书身份验证尚未建立。
简单来说,当Web应用程序托管在IIS中时,我们禁用IIS中的其他认证方式,启用IIS客户端证书映射认证。当客户端尝试访问 website/service.
时,服务器需要客户端证书
随后,下面的函数方法将有一个返回值。
public ActionResult About()
{
var result = System.Web.HttpContext.Current.Request.ClientCertificate;
ViewBag.Message = result.Subject+result.ServerSubject;
return View();
}
什么是IIS客户端证书映射认证以及如何在IIS中实现请参考文档
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/security/authentication/iisclientcertificatemappingauthentication/
https://docs.microsoft.com/en-us/troubleshoot/iis/configure-many-to-one-client-mappings
https://docs.microsoft.com/en-us/iis/manage/configuring-security/configuring-one-to-one-client-certificate-mappings
如果有什么我可以帮忙的,请随时告诉我。
我的客户端代码使用 WebClient
并将证书附加到 ClientCertificates
:
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
var x509 = GetMyCert(); // see note
request.ClientCertificates.Add( x509 );
return request;
}
注意:我已经检查了调试器,变量 x509
在代码的此时确实包含一个有效的证书对象。
这不是将证书添加到 HttpWebRequest 以供网络应用程序使用的正确方法吗?
服务器端,证书未显示在 IHttpHandler
的 ProcessRequest
方法中:
context.Response.Clear();
// set some Response caching parameters here <snip>
HttpClientCertificate cert = context.Request.ClientCertificate;
if (cert.IsPresent)
{
Hooray();
}
else
{
BooHoo(); // we are here
}
web.config
设置为接受客户端证书:
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
</security>
</system.webServer>
Web应用配置不完整?
P.S。如果我将回调添加到覆盖的 GetWebRequest
方法:
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate (Object obj, X509Certificate X509certificate, X509Chain chain,
System.Net.Security.SslPolicyErrors errors)
{
return (errors == SslPolicyErrors.None);
};
errors
是 SslPolicyErrors.None
和回调 returns true
。但据我所知,我没有在服务器上创建任何策略,除非有某种默认设置。
证书未显示在 HttpContext 中的原因是 client-side 和 server-side 之间的证书身份验证尚未建立。
简单来说,当Web应用程序托管在IIS中时,我们禁用IIS中的其他认证方式,启用IIS客户端证书映射认证。当客户端尝试访问 website/service.
时,服务器需要客户端证书
随后,下面的函数方法将有一个返回值。
public ActionResult About()
{
var result = System.Web.HttpContext.Current.Request.ClientCertificate;
ViewBag.Message = result.Subject+result.ServerSubject;
return View();
}
什么是IIS客户端证书映射认证以及如何在IIS中实现请参考文档
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/security/authentication/iisclientcertificatemappingauthentication/
https://docs.microsoft.com/en-us/troubleshoot/iis/configure-many-to-one-client-mappings
https://docs.microsoft.com/en-us/iis/manage/configuring-security/configuring-one-to-one-client-certificate-mappings
如果有什么我可以帮忙的,请随时告诉我。