2011-07-01 65 views
3

我想将对.NET Web服务的访问限制为特定的客户端列表。他们会将他们的客户证书附加到他们的每一个请求上,只有在“名单上”时才能得到适当的回应。使用客户端证书身份验证创建.NET Web服务

但是如何以及在哪里最好的实现呢?

在IIS(7.0)上,我可以设置require客户端证书选项,但是我在哪里指定允许我访问哪些客户端证书?我需要Web服务器机器的证书存储中的客户端证书的公共部分吗?

或者必须像这样的设置在代码中处理,我以某种方式提取客户端证书ID并将其匹配到本地列表?

或者换个方式吗?

回答

3

一种方法列表如下。

为了举办您可能需要您的Web服务器上运行以下命令WCF服务:

"%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r –y 

在IIS设置您的网站使用https绑定(只),并在SSL设置您将其设置为需要SSL并需要客户端证书。

仅此一项仅允许使用有效的客户端证书和Web服务器信任的颁发者访问您的服务(和wsdl)。

为了限制访问你可以设置你的WCF的配置文件与bindingConfiguration具体证书:

<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(); 
    } 
} 
1

如果这些客户端证书来源于特定的根CA,则可以有条不紊地使用CTL

否则,我认为你有这些选项(根据您的需要):

  • 如果您有机会获得客户端证书.CER文件,你可以使用client certificate mapping并映射到Windows帐户,optinally将他们分组到AD /本地组和相应的权限。
  • 提取UPN代码(也许在HTTP处理程序),并验证反对授予UPN的打造上IIS7 WCF服务与您的安全要求
相关问题