使用客户端证书身份验证创建.NET Web服务

时间:2011-07-01 06:58:45

标签: .net web-services security certificate

我想将对.NET Web服务的访问限制为特定的客户端列表。他们会将他们的客户证书附加到他们的每个请求中,只有在列表中排除"才能得到正确的答复。

但实现这个目标的最佳方法是什么?在哪里?

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

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

还是另一种方式?

2 个答案:

答案 0 :(得分:3)

根据您的安全要求在IIS7上创建WCF服务的一种方法如下。

要托管WCF服务,您可能需要在Web服务器上运行以下命令:

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

答案 1 :(得分:1)

如果这些客户端证书来自特定的根CA,则可以使用CTL

否则我认为你有这些选择(取决于你的需要):

  • 如果您有权访问客户端cert .cer文件,则可以使用client certificate mapping并映射到Windows帐户,最好将它们分组到AD /本地组和相应的权限。
  • 在代码中提取UPN(可能在HTTP处理程序中)并根据授予的UPN列表进行验证