Как зафиксировать проблему WCF maxClockSkew в контексте приложения Silverlight HTTPS?

Ситуация: приложение Silverlight 4, общающееся с серверным компонентом через WCF, с помощью basicHttpBinding и HTTPS.

Вот используемая сторона сервера привязки:



      
      
        
        
      
    

Заметьте, что мы используем TransportWithMessageCredential в качестве режима безопасности. Сертификат правильно установлен на IIS.

Выполнение приложения гладко при выполнении локально.

Однако у нас теперь есть внешние пользователи, соединяющиеся с нашим приложением. Некоторые из них испытывают трудности и смотрят в журналах сервера, мы обнаружили эту ошибку:

"MessageSecurityException" метка времени безопасности является устаревшей, потому что ее время истечения срока ('2010-10-18T22:37:58.198Z') находится в прошлом. Текущее время является '2010-10-18T22:43:18.850Z', и позволенная расфазировка тактовых сигналов является '0:05:00'.

Мы провели обычное исследование по темам в сети (StackoverFlow & Google... и Bing), для чтения больше по теме. Мы связались с пользователями, чтобы гарантировать, что они были смещением времени с нашим сервером, который был позже подтвержден.

Эта статья MSDN была запуском: http://msdn.microsoft.com/en-us/library/aa738468.aspx

Которые используют CustomBinding по существующей привязке, и устанавливает свойство MaxClockSkew на SecurityBindingElement пользовательской привязки. Мы реализовали это решение, изменив однако SymmetricSecurityBindingElement на TransportSecurityBindingElement, так как наша привязка для безопасной связи с Silverlight является basicHttpBinding с HTTPS.

Несколько статей о сети (включая эту упомянутую выше статью MSDN) показывают фрагменты кода, которые дополнительно устанавливают maxClockSkew свойство на начальную загрузку элементы, взятые от ProtectionTokenParameters. Я никогда не успешно выполнялся для применения этой части в нашем коде, так как TransportSecurityBindingElement, кажется, не имеет ProtectionTokenParameters.

Вот наш код для обертывания привязки с maxClockSkew:

protected virtual System.ServiceModel.Channels.Binding WrapClockSkew(System.ServiceModel.Channels.Binding currentBinding)
    {
        // Set the maximum difference in minutes
        int maxDifference = 300;

        // Create a custom binding based on an existing binding
        CustomBinding myCustomBinding = new CustomBinding(currentBinding);

        // Set the maxClockSkew
        var security = myCustomBinding.Elements.Find();
        if (security != null)
        {
            security.LocalClientSettings.MaxClockSkew = TimeSpan.FromMinutes(maxDifference);
            security.LocalServiceSettings.MaxClockSkew = TimeSpan.FromMinutes(maxDifference);
        }


        return myCustomBinding;
    }

'Безопасность. LocalClientSettings может быть бесполезным здесь, так как этот код для стороны сервера.

Этот код не добивался цели, у нас все еще было то же сообщение об ошибке на сервере, когда у нас было различие больше чем 5 минут с сервером. Я все еще имел в виду это, мы не применяли прием начальной загрузки фрагмента кода MSDN.. таким образом, мы продолжали наш веб-поиск по теме.

Мы нашли аккуратное wcf поведение, которое, мы думали, решит нашу проблему.

Было похоже, что это занимается Начальной загрузкой обязательные вопросы!

Вот часть, где она ищет Маркерные Параметры в контексте TransportSecurityBindingElement:

//If the securityBindingElement's type is TransportSecurityBindingElement
if (securityBindingElement is TransportSecurityBindingElement)
{
foreach (SecurityTokenParameters securityTokenParameters in 
    securityBindingElement.EndpointSupportingTokenParameters.Endorsing)
{
    //Gets it from the EndpointSupportingTokenParameters.Endorsing property
    if (securityTokenParameters is SecureConversationSecurityTokenParameters)
    {
        secureConversationSecurityTokenParameters =
            securityTokenParameters as SecureConversationSecurityTokenParameters;

        break;
    }
}
}

Отметьте 'securityBindingElement. EndpointSupportingTokenParameters. Одобрение'... В нашей ситуации (basicHttpBinding, TransportWithMessageCredential, Https...), этот набор однако пуст!

Так, никакой способ получить securityTokenParameters, таким образом невозможный установить maxClockSkew.

Вопросы:

  • Действительно ли наша привязка является неправильной в SL + WCF + контекст HTTPS?

  • Действительно ли нормально не найти какой-либо способ установить maxClockSkew на элементе начальной загрузки в TransportSecurityBindingElement?

  • Действительно ли мы - единственная компания, делающая HTTPS приложение Silverlight с клиентами, которые не могли бы быть на том же самом времени (с + - смещение 5 минут)?

  • Почему это, кажется, настоящее приключение для фиксации такой тривиальной конфигурации?

Любая справка ценилась бы!

6
задан Mathieu Hétu 19 October 2010 в 19:08
поделиться