Почему моя конечная точка WCF не генерирует исключение Max Clock Skew? - PullRequest
5 голосов
/ 08 августа 2010

Почти во всех (защищенных) конечных точках службы WCF в моем приложении, если системные часы клиента установлены слишком далеко в будущем или прошлом, я получаю исключение из механизма перекоса часов WCF (описанного здесь: http://www.danrigsby.com/blog/index.php/2008/08/26/changing-the-default-clock-skew-in-wcf/).

Однако одна конечная точка, в которой реализован мой метод Login (), никогда не выдает это исключение, даже если для него включена защита транспорта (естественно, учетные данные для него не требуются).

Почему нет "Механизм Clock Skew "работает для этой конечной точки? Может, это потому, что clientCredentialType имеет значение" None "?

В качестве примера приведу упрощенную версию моей конфигурации:

<services>
    <service name="Foo">
        <endpoint address=""
            binding="wsHttpBinding"
            bindingConfiguration="binding1"
            contract="IFoo" />
    </service>
</services>

<bindings>
    <wsHttpBinding> 
        <binding name="binding1" maxReceivedMessageSize="100000000">
            <readerQuotas maxDepth="1000000000" maxArrayLength="1000000000" maxStringContentLength="1000000000" />
            <security mode="Transport">
                <transport clientCredentialType ="None"/>
            </security>
            <reliableSession enabled="false" />
        </binding>
    </wsHttpBinding>    
</bindings>     

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Режим безопасности - security mode = "Transport" - не включает отметку времени в сообщении, которая приводит к тому, что проверка MaxClockSkew игнорирует сообщение и не вызывает исключение безопасности. Измените режим безопасности на режим безопасности = "TransportWithMessageCredential", который включает отметки времени и позволяет проверке MaxClockSkew проверять сообщение на наличие разницы во времени.

1 голос
/ 09 августа 2010

У других людей похожая проблема:

Запуск MaxClockSkew при доступе к службе WCF

Так что я не думаю, что это проблема с вашей конфигурацией.

Похоже, что если он не использует машинное время, он не проверяет, есть ли разница во времени между машинами.

Вы можете запрограммировать свой обходной путь, отправить время клиентского компьютера в качестве параметра в методе входа в систему, если он отличается, выдать исключение.

...