Ситуация: приложение 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 минут)?
Почему это, кажется, настоящее приключение для фиксации такой тривиальной конфигурации?
Любая справка ценилась бы!