Можете ли вы изменить BehaviorExtension с помощью конфигурации WCF?

Мой сайт вызывает сервис (назовем его FooService), который требует очень сложного набора протоколов аутентификации. Все протоколы заключены в собственное поведение ClientCredentials, которое объявлено следующим образом в коде:

class FooServiceCredentialsBehavior : ClientCredentials 
{
    public FooServiceCredentialsBehavior()
    {
        //Set up service certificate
        var cert = CertStore.FindBySerialNumber(certSerialNumber);
        base.ServiceCertificate.DefaultCertificate = cert;
    }
}

Затем мы регистрируем расширение поведения:

  <behaviorExtensions>
    <add name="FooServiceCredentials" type="MyProject.Namespace.FooService, MyProject" />
  </behaviorExtensions>

Настройте конечную точку поведения, чтобы использовать ее:

<endpointBehaviors>
    <behavior name="FooServiceCredentialsBehavior">
      <FooServiceCredentials />
    </behavior>

И настроить конечную точку для работы с ней:

<endpoint address="https://fooservice.com/bar"
          behaviorConfiguration="FooServiceCredentialsBehavior"
          contract="FooService_PortType" />

Все вышеперечисленное прекрасно работает и имеет для многих клиентов долгие годы.

Сейчас я внедряю этот материал в систему, которая не может получить доступ к серверам CRL, и пользовательское поведение включает в себя сертификат службы с включенной проверкой. Поэтому мне нужно отключить проверку. Однако я не могу изменить класс FooServiceCredentials. Если бы я мог, я бы просто сделал это:

base.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

Но я не могу.

Я хотел бы знать, возможно ли добавить конфигурацию WCF, которая применяется к поведению пользовательских учетных данных, которое будет делать то же самое. Что-то вроде этого:

<endpointBehaviors>
    <behavior name="FooServiceCredentialsBehavior">
      <FooService>
          <ServiceCertificate>
              <authentication certificateValidationMode="None"/>
          </ServiceCertificate>
      </FooService>
    </behavior>

Этот точный XML не работает (служба даже не запускается), но я надеюсь, что есть какой-то волшебный способ упорядочить эти теги, чтобы отключить проверку сертификата службы только из конфигурации.

Является ли это возможным? Как?

1 ответ

Решение

Официальная документация говорит, что это возможно сделать. Проверьте следующую ссылку: аутентификация элемента serviceCertificate.

Я думаю, что с конфигурацией поведение Extension у вас есть следующая конфигурация должна работать, так как вы наследуете от ClientCredentials:

<behavior name="FooServiceCredentialsBehavior">
  <FooServiceCredentials>
      <serviceCertificate>
        <authentication certificateValidationMode="None" revocationMode="NoCheck" />
      </serviceCertificate>
  </FooServiceCredentials>
</behavior>

Если это не работает, есть еще один возможный вариант, без использования поведение Extension и указания вашего класса непосредственно в конфигурации clientCredentials, например так:

<behavior name="FooServiceCredentialsBehavior">
  <clientCredentials type="FooNamespace.FooServiceCredentialsBehavior, FooAssemblyName">
      <serviceCertificate>
        <authentication certificateValidationMode="None" revocationMode="NoCheck" />
      </serviceCertificate>
  </clientCredentials>
</behavior>
Другие вопросы по тегам