Ситуация : приложение Silverlight 4 обменивается данными с компонентом сервера через WCF с использованием basicHttpBinding и HTTPS.
Вот привязка, используемая на стороне сервера:
<basicHttpBinding>
<binding name="DefaultSecuredBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647">
<readerQuotas maxDepth="50" maxArrayLength="2147483647" maxStringContentLength="2147483647" />
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName"/>
<transport clientCredentialType="None" proxyCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
Обратите внимание, что мы используем TransportWithMessageCredential в качестве режима безопасности.Сертификат правильно установлен в IIS.
Приложение работает без проблем при локальном запуске.
Однако теперь к нашему приложению подключаются внешние пользователи.Некоторые из них испытывают трудности и, просматривая журналы сервера, мы обнаружили эту ошибку:
«MessageSecurityException» Отметка времени безопасности устарела, поскольку время ее истечения ('2010-10-18T22: 37: 58.198Z ') в прошлом.Текущее время: «2010-10-18T22: 43: 18.850Z», допустимый перекос часов - «00: 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<TransportSecurityBindingElement>();
if (security != null)
{
security.LocalClientSettings.MaxClockSkew = TimeSpan.FromMinutes(maxDifference);
security.LocalServiceSettings.MaxClockSkew = TimeSpan.FromMinutes(maxDifference);
}
return myCustomBinding;
}
«security.LocalClientSettings» здесь может быть бесполезен, поскольку этот код предназначен для серверной части.
Этот код не добился целиу нас все еще было то же сообщение об ошибке на сервере, когда у нас было больше 5 минут разницы с сервером.Я все еще имел в виду, что мы не применили прием начальной загрузки фрагмента кода MSDN ... поэтому мы продолжили наш веб-поиск по этой теме.
Мы нашли аккуратное поведение wcf, которое, как мы думали, исправит нашпроблема.
Похоже, он обрабатывает вопросы привязки Bootstrap!
Вот часть, где он ищет Параметры токена в контексте 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.Endorsing' ... В нашей ситуации (basicHttpBinding, TransportWithMessageCredential, Https ...) эта коллекция, однако, пуста!
нет способа получить параметры securityTokenParameters, поэтому невозможно установить maxClockSkew.
Вопросы:
Являются ли наши привязки неверными в контексте SL + WCF + HTTPS?
Нормально ли не найти способ установить maxClockSkew для элемента начальной загрузки в TransportSecurityBindingElement?
Являемся ли мы единственной компанией, которая использует приложение HTTPS Silverlight для клиентов, которые могут не работать в одно и то же время (со смещением + - 5 минут)?
Почему этоПохоже, это приключение, чтобы исправить такую тривиальную конфигурацию?
Любая помощь будет признательна!