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

lox*_*lox 5 .net security web-services certificate

我想将对 .NET Web 服务的访问限制为特定的客户端列表。他们会将客户证书附加到每个请求中,并且只有在“在列表中”时才会得到正确的响应。

但如何以及在哪里实施这一点的最佳方法是?

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

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

或者其他方式?

lox*_*lox 3

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

\n\n

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

\n\n
"%windir%\\Microsoft.NET\\Framework\\v3.0\\Windows Communication Foundation\\ServiceModelReg.exe" -r \xe2\x80\x93y\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 IIS 上,您使用 https 绑定(仅)设置站点,并在 SSL 设置下将其设置为需要 SSL 并需要客户端证书。

\n\n

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

\n\n

为了限制对特定证书的访问,您可以使用 bindingConfiguration 设置 WCF 配置文件,如下所示:

\n\n
<basicHttpBinding>\n  <binding name="MyBasicHttpBinding">\n    <security mode="Transport">\n      <transport clientCredentialType="Certificate" />\n    </security>\n  </binding>\n</basicHttpBinding>\n
Run Code Online (Sandbox Code Playgroud)\n\n

带有自定义证书验证器的行为配置如下:

\n\n
<behaviors>\n  <serviceBehaviors>\n    <behavior name="MyServiceBehavior">\n      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />\n      <serviceDebug includeExceptionDetailInFaults="false" />\n      <serviceCredentials>\n        <clientCertificate>\n          <authentication certificateValidationMode="Custom"\n            customCertificateValidatorType="<project-namespace>.ClientCertificateValidator, <project-namespace>"/>\n        </clientCertificate>\n      </serviceCredentials>\n    </behavior>\n  </serviceBehaviors>\n</behaviors>\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后在项目的新类中实现自定义验证器,如下所示:

\n\n
public class ClientCertificateValidator : X509CertificateValidator\n{\n    public override void Validate(X509Certificate2 certificate)\n    {\n      if (certificate.Thumbprint != <allowed-thumbprint>)\n        throw new Exception();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n