使用客户端证书认证创建.NET Web服务

5
我想限制对我的.NET Web服务的访问,只允许特定客户端列表的访问。他们将在每个请求中附加其客户端证书,并且只有当他们“在列表上”时才会获得适当的响应。
但是最佳实现方式在哪里以及如何实现呢?
在IIS(7.0)上,我可以设置需要客户端证书选项,但是我在哪里指定允许访问的客户端证书?我需要将客户端证书的公共部分放在Web服务器计算机的证书存储区吗?
还是必须在代码中处理这样的设置,从而提取客户端证书ID并将其与本地列表匹配?
或者还有其他方法吗?
2个回答

3

以下是使用您的安全要求在IIS7上创建WCF服务的一种方法。

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

"%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文件,则可以使用客户端证书映射并映射到Windows帐户(可选择将其分组到AD /本地组并相应地授予权限)。
  • 在代码中提取UPN(可能在HTTP处理程序中)并针对授予的UPN列表进行验证

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接