У меня есть служба WCF с настраиваемой привязкой и настраиваемым средством проверки сертификата.
Средство проверки сертификата определяется следующим образом.Позже он будет расширен, но сейчас выполняется базовая проверка.
public class MyX509CertificateValidator : X509CertificateValidator
{
private static readonly ILog Logger = LogManager.GetLogger(typeof(MyX509CertificateValidator));
public MyX509CertificateValidator()
{
Logger.Info("certval - Constructor ");
}
public override void Validate(X509Certificate2 certificate)
{
Logger.Info("certval - Validate(). Calling Cert.validate()");
bool verifyResult = certificate.Verify();
Logger.Info("verify result: " + verifyResult);
if (!verifyResult)
{
throw new SecurityTokenValidationException("cert had some bad juju");
}
}
}
Мой web.config настроен следующим образом.Цель состоит в том, чтобы использовать безопасность транспорта и использовать сеансы.Я хочу, чтобы сертификат был проверен один раз, когда создается сеанс.Однако во время входа в систему проверки сертификатов я вижу, что проверка выполняется для каждого вызова службы, который выполняет клиент, при использовании существующего открытого клиентского прокси-сервера WCF.
Я подтвердил, что мой экземпляр службы WCFсоздается один раз за сеанс (вход в конструктор вызывается один раз за сеанс).Но валидатор сертификата вызывается при каждом вызове службы.Как я могу заставить валидатор сертификата вызываться только в начале сеанса?
Учитывая, что он, похоже, использует сеансы, я предполагал, что проверка сертификата будет заполнена sesssion, и вызывался только один раз длясессия.Я просмотрел документацию по конфигурации WCF для MSDN и не вижу способа дальнейшей настройки тега надежного сеанса или чего-либо, связанного с безопасностью, для выполнения того, что я хочу.
Вот файл web.config и определение службы
[ServiceBehavior(AutomaticSessionShutdown = true,
InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class WcfBasicService : IWcfBasicService
{
...
<system.serviceModel>
<bindings>
<customBinding>
<binding name="reliableSessionOverHttps">
<reliableSession/>
<security authenticationMode="CertificateOverTransport"/>
<httpsTransport />
</binding>
</customBinding>
</bindings>
<services>
<service name="WcfServiceLibrary1.WcfBasicService">
<endpoint address="" binding="customBinding" contract="WcfServiceLibrary1.IWcfBasicService" name="mainEndpoint"
bindingConfiguration="reliableSessionOverHttps">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="WcfServiceLibrary1.MyX509CertificateValidator, WcfServiceLibrary1" />
</clientCertificate>
</serviceCredentials>
<!-- To avoid disclosing metadata information,
set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" />
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>