Wcf 自定义证书验证不验证
Wcf custom certificate validation doesn't validate
我试图找出我的 wcf 配置中的错误,但找不到问题出在哪里。可能我需要更多的眼睛;无论如何我想在 wcf 中使用自定义认证验证。我在我的 CertificateValidator class 中设置了断点,但是这个断点没有捕获到任何请求,但是应用程序是 运行,我可以发送请求(没有证书)。
这是我的配置
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding maxReceivedMessageSize="104857600">
<security>
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="AccountService" behaviorConfiguration="">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IAccountService"></endpoint>
</service>
<service name="PortalService" behaviorConfiguration="">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IPortalService"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
您使用的是 NET 4 还是 4.5?
我认为你错过的事情:
- 您的自定义
basicHttpBinding
需要使用 <security mode="Message">
(目前您没有指定它,这意味着默认为 "None"
)
- 您的自定义
basicHttpBinding
需要一个 name=
以便可以引用
- 您的端点需要使用
bindingConfiguration=
来引用自定义 basicHttpBinding
- 您的自定义服务行为需要一个
name=
以便被引用
- 您的服务需要使用
behaviorConfiguration=
来引用自定义服务行为
- 您的服务需要在
<serviceCredentials>
中指定一个 <serviceCertificate>
,用于在协议中与客户端建立安全通道
- 您的客户端需要知道
<clientCredentials>
中的 '<serviceCertificate>'
以便它可以与服务器建立安全通道
- 您的客户端需要将用于凭据的证书附加到发送到服务器的请求(通过在 .config 中的
<clientCredentials>
中指定 <clientCertificate>
,或者以编程方式)
- 确保您已正确创建和安装证书
注意:您应该至少创建了 2 个证书
- 1 用于服务器的标识
- 1 个或多个客户端用于凭据(取决于您是否决定所有客户端都应出示相同的证书,或者您是否为每个客户端分配唯一的证书)
- 不要对服务器身份和客户端凭据使用相同的证书
一些有助于理解的链接"message level security":
- http://dotnetmentors.com/wcf/wcf-message-level-security-by-example.aspx
- http://shaunrostami.blogspot.co.uk/2012/02/there-are-situation-where-you-cant-use.html
- https://msdn.microsoft.com/en-us/library/ms733098%28v=vs.110%29.aspx
如果您的消息交换对您来说太慢,请考虑使用 "Transport" 级别的安全性。
试试这个:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="securebasicHttpBinding" maxReceivedMessageSize="104857600">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="secureBehaviour" name="AccountService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding"
contract="IAccountService" />
</service>
<service behaviorConfiguration="secureBehaviour" name="PortalService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding"
contract="IPortalService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="secureBehaviour">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<serviceCertificate ...something goes here... />
<clientCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
我试图找出我的 wcf 配置中的错误,但找不到问题出在哪里。可能我需要更多的眼睛;无论如何我想在 wcf 中使用自定义认证验证。我在我的 CertificateValidator class 中设置了断点,但是这个断点没有捕获到任何请求,但是应用程序是 运行,我可以发送请求(没有证书)。
这是我的配置
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding maxReceivedMessageSize="104857600">
<security>
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="AccountService" behaviorConfiguration="">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IAccountService"></endpoint>
</service>
<service name="PortalService" behaviorConfiguration="">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IPortalService"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
您使用的是 NET 4 还是 4.5?
我认为你错过的事情:
- 您的自定义
basicHttpBinding
需要使用<security mode="Message">
(目前您没有指定它,这意味着默认为"None"
) - 您的自定义
basicHttpBinding
需要一个name=
以便可以引用 - 您的端点需要使用
bindingConfiguration=
来引用自定义 - 您的自定义服务行为需要一个
name=
以便被引用 - 您的服务需要使用
behaviorConfiguration=
来引用自定义服务行为
- 您的服务需要在
<serviceCredentials>
中指定一个<serviceCertificate>
,用于在协议中与客户端建立安全通道 - 您的客户端需要知道
<clientCredentials>
中的'<serviceCertificate>'
以便它可以与服务器建立安全通道 - 您的客户端需要将用于凭据的证书附加到发送到服务器的请求(通过在 .config 中的
<clientCredentials>
中指定<clientCertificate>
,或者以编程方式) - 确保您已正确创建和安装证书
basicHttpBinding
注意:您应该至少创建了 2 个证书 - 1 用于服务器的标识 - 1 个或多个客户端用于凭据(取决于您是否决定所有客户端都应出示相同的证书,或者您是否为每个客户端分配唯一的证书) - 不要对服务器身份和客户端凭据使用相同的证书
一些有助于理解的链接"message level security":
- http://dotnetmentors.com/wcf/wcf-message-level-security-by-example.aspx
- http://shaunrostami.blogspot.co.uk/2012/02/there-are-situation-where-you-cant-use.html
- https://msdn.microsoft.com/en-us/library/ms733098%28v=vs.110%29.aspx
如果您的消息交换对您来说太慢,请考虑使用 "Transport" 级别的安全性。
试试这个:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="securebasicHttpBinding" maxReceivedMessageSize="104857600">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="secureBehaviour" name="AccountService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding"
contract="IAccountService" />
</service>
<service behaviorConfiguration="secureBehaviour" name="PortalService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding"
contract="IPortalService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="secureBehaviour">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<serviceCertificate ...something goes here... />
<clientCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>