Можете ли вы изменить 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>