使用Unity在WCF中的自定义X509CertificateValidator类中的依赖注入

时间:2012-06-15 08:59:54

标签: wcf dependency-injection unity-container x509certificate

我们正在使用WCF服务以及基于证书的身份验证和wsHttpBinding。

我编写了自定义类来进行身份验证。这个类来自System.IdentityModel.Selectors.X509CertificateValidator。

 public class MyX509CertificateValidator : System.IdentityModel.Selectors.X509CertificateValidator
    {


        public override void Validate(X509Certificate2 certificate)
        {
            /// Custom code goes here
        }
    }

此类在web.config中配置

 <behavior name="customBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="Custom"
                              customCertificateValidatorType="**SampleClass.MyX509CertificateValidator** ,SampleClass"
                              revocationMode="NoCheck"/>
            </clientCertificate>
            <serviceCertificate
              findValue="XXXXXXXXXXXXXXXX"
              x509FindType="FindByThumbprint"
              storeLocation="CurrentUser"
              storeName="My"/>
          </serviceCredentials>

我正在使用Unity.WCF nuget包来向WCF添加DI支持。我的问题是我无法在上面的类中注入依赖项。 Unity不提供此课程。调用WCF时,WCF运行时会自动调用它。

我们真的可以在上面的类中添加依赖注入支持吗?

1 个答案:

答案 0 :(得分:1)

您仍然可以将依赖项注入自定义证书验证程序:

您可以通过构造函数接受它:

public class CertificateValidator : X509CertificateValidator
{
    private IMyDependency _dependency;

    public CertificateValidator(IMyDependency dependency)
    {
        _dependency = dependency;
    }

    public override void Validate(X509Certificate2 certificate)
    {
        ...

然后在配置服务主机时传递它:

serviceHost.Credentials.ClientCertificate.Authentication.CustomCertificateValidator =
    new CertificateValidator(dependency);

您可以使用IOC容器为创建服务主机的程序部分提供依赖项。