使用客户端证书身份验证创建.NET web服务
我想将对.NET web服务的访问限制为特定的客户端列表。他们会将客户端证书附加到他们的每个请求上,并且只有当他们“在列表上”时才会得到正确的响应 但如何以及在何处实施这一目标的最佳方式 在IIS(7.0)上,我可以设置require client certificate选项,但在哪里指定允许访问的客户端证书?我是否需要web服务器计算机的证书存储中客户端证书的公共部分 或者像这样的设置必须在代码中处理,在代码中我以某种方式提取客户端证书ID并将其与本地列表匹配使用客户端证书身份验证创建.NET web服务,.net,web-services,security,certificate,.net,Web Services,Security,Certificate,我想将对.NET web服务的访问限制为特定的客户端列表。他们会将客户端证书附加到他们的每个请求上,并且只有当他们“在列表上”时才会得到正确的响应 但如何以及在何处实施这一目标的最佳方式 在IIS(7.0)上,我可以设置require client certificate选项,但在哪里指定允许访问的客户端证书?我是否需要web服务器计算机的证书存储中客户端证书的公共部分 或者像这样的设置必须在代码中处理,在代码中我以某种方式提取客户端证书ID并将其与本地列表匹配 或者另一种方式?如果这些客户端证
或者另一种方式?如果这些客户端证书来自特定的根CA,则可以使用 否则,我认为您有以下选择(取决于您的需要):
- 如果您有权访问客户端cert.cer文件,您可以使用并映射到Windows帐户,选择将其分组为AD/本地组并相应地授予权限
- 在代码中提取UPN(可能在HTTP处理程序中),并根据已授予UPN的列表进行验证
"%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r –y
在IIS上,您使用https绑定(仅限)设置站点,在SSL设置下,您将其设置为需要SSL和客户端证书
仅此一项就只允许使用有效的客户端证书和web服务器信任的颁发者访问您的服务(和wsdl)
为了限制对特定证书的访问,您可以使用bindingConfiguration将WCF配置文件设置为:
<basicHttpBinding>
<binding name="MyBasicHttpBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
以及带有自定义证书验证程序的behaviorConfiguration,如下所示:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="Custom"
customCertificateValidatorType="<project-namespace>.ClientCertificateValidator, <project-namespace>"/>
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
最后,在项目中的新类中实现自定义验证器,如下所示:
public class ClientCertificateValidator : X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
if (certificate.Thumbprint != <allowed-thumbprint>)
throw new Exception();
}
}
公共类客户端CertificateValidator:X509CertificateValidator
{
公共覆盖无效验证(X509Certificate2证书)
{
如果(certificate.Thumbprint!=)
抛出新异常();
}
}