天道酬勤,学无止境

为什么我的 WCF 端点不抛出 Max Clock Skew 异常?(Why doesn't my WCF endpoint throw a Max Clock Skew exception?)

问题

对于我的应用程序中几乎所有(安全)WCF 服务端点,如果客户端的系统时钟在未来或过去设置得太远,我会从 WCF 时钟偏移机制中得到一个异常(此处描述:http://www.danrigsby .com/blog/index.php/2008/08/26/changed-the-default-clock-skew-in-wcf/)。

然而,实现我的 Login() 方法的一个端点永远不会抛出这个异常,即使它启用了传输安全(自然不需要凭据)。

为什么“时钟偏移机制”不适用于此端点? 也许是因为 clientCredentialType 设置为“无”?

例如,这是我的配置的简化版本:

<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>     
回答1

安全模式 - security mode="Transport" - 不会在消息中包含时间戳,这会导致 MaxClockSkew 验证忽略消息并且不会引发安全异常。 将安全模式更改为 security mode="TransportWithMessageCredential",其中包括时间戳并允许 MaxClockSkew 验证来测试消息的时间增量。

回答2

其他人也有类似的问题:

访问WCF服务时触发MaxClockSkew

所以我不认为这是你的配置问题。

看起来,如果它不使用机器时间,它就不会检查机器之间是否存在时间差异。

您可以围绕它进行编程,将客户端机器时间作为登录方法中的参数发送,如果不同,则抛出异常。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Why doesn't my WCF endpoint throw a Max Clock Skew exception?
    With almost all of the (secure) WCF service endpoints in my application, if the client's system clock is set too far in the future or past, I get an exception from WCFs Clock Skew mechanism (described here: http://www.danrigsby.com/blog/index.php/2008/08/26/changing-the-default-clock-skew-in-wcf/). However the one endpoint where my Login() method is implemented never throws this exception even though it has transport security enabled (naturally no credentials are required for it). Why isn't the "Clock Skew mechanism" working for this endpoint? Maybe it's because clientCredentialType is set to
  • 在 wcf 安全模式设置中设置时钟偏差的目的是什么(What is the purpose of set clock skew in wcf security mode settings)
    问题 我的 WCF 应用程序中的时钟偏差导致了一个问题。 我很困惑为什么微软会设置这个规则。 当服务器和客户端之间的时钟偏差超过设置的最大值时,为什么服务拒绝请求。 (我不确定它是否被服务器拒绝,它以任何方式引发异常)。 在 wcf 安全模式设置中设置时钟偏差的目的是什么? 回答1 这是防止重放攻击的安全功能。 本质上,创建消息时的安全时间戳仅在有限的时间内有效,并在此之后到期。 但要使服务和客户在容差范围内就共同时间达成一致,才能使其发挥作用。 这就是 maxclockskew 设置的作用。 这里的一些信息 http://msdn.microsoft.com/en-us/library/ms733063.aspx
  • What is the purpose of set clock skew in wcf security mode settings
    I have got an issue caused by clock skew in my WCF application. I'm confused why Microsoft set this rule. Why did the service refused the request when clock skew between server and client was over the max value been set. (I not sure if it was refused by server, it raised exception any way). What is the purpose of set clock skew in wcf security mode settings ?
  • 为什么 kerberos 在 WCF 中默认为 NTLM?(Why is kerberos defaulting to NTLM in WCF?)
    问题 有一个简单的 WCF 演示应用程序,它有两个控制台项目——主机和客户端。 两者都在我的机器上运行(win 7 box)。 我正在使用 netTcpBinding,它使用 Windows 身份验证。 问题是身份验证正在从 kerberos 降级到 NTLM,我不知道为什么。 如果我使用 <clientCredentials> <windows allowNtlm="true" /> </clientCredentials> 在客户端,一切都很酷。 但是,如果我将其更改为false ,则会出现以下异常: SecurityNegotiationException: 远程服务器不满足相互身份验证要求。 这表明 kerberos 失败,并且由于客户端不允许 NTLM,因此调用会导致抛出异常。 这是项目的问题,还是我的开发机器的配置导致的外部问题? 解决方案: 显然,我必须在客户端配置中指定服务器的身份。 就我而言,服务器以我的身份运行,因此我修改了客户端: <client> <endpoint address="net.tcp://dev7.HurrDurr.com:12345/MyService" binding="netTcpBinding" bindingConfiguration="MyBindingConfigurationLol" behaviorConfiguration
  • 如何在 WCF 中接受基类型的集合(How to accept a collection of a base type in WCF)
    问题 设置 我有一个 WCF 服务,它公开一个基本类型(例如 Animal)以及一些派生类型(例如 Lion、Tiger 和 Bear)。 另一种类型(例如 Zoo)包括一个属性,它是基本类型的集合。 基类型是具体的,而不是抽象的,因此集合包含基类型和/或派生类型(任意组合)的实例是完全可以接受的。 例如: [DataContract, KnownType(typeof(Lion)), KnownType(typeof(Tiger)), KnownType(typeof(Bear))] public class Animal { [DataMember] public string Species { get; set; } } [DataContract] public class Lion : Animal { } [DataContract] public class Tiger : Animal { } [DataContract] public class Bear : Animal { } [DataContract] public class Zoo { [DataMember] public List<Animal> Animals { get; set; } } 我的一项服务操作接受此类型作为其参数,如下所示: [ServiceContract] public
  • WCF Net.TCP 服务抛出模糊错误(WCF Net.TCP service throwing obscure errors)
    问题 我正在尝试为现有的 WCF 服务启用额外的 net.tcp 端点(使用用户名身份验证)。 该服务托管在 IIS7 中。 对服务执行客户端会返回套接字连接已中止的错误。 启用对服务的跟踪显示抛出以下异常: System.ArgumentOutOfRangeException 此参数的值必须为正。 参数名称:maxAccepts 实际值为 0。 我很困惑,因为尽我所能告诉配置应该禁用端口共享(见下文),但它仍然通过端口共享代码调用(再次,尽我所能)。 无论如何,我找不到任何方法来指定这个 maxAccepts 值; 谷歌对此一无所知,maxPendingAccepts 值似乎也没有做到这一点。 如何解决错误? 服务的配置文件包含 net.tcp 端点的以下内容: <bindings> <customBinding> <binding name="netTcp"> <security authenticationMode="UserNameOverTransport" /> <windowsStreamSecurity /> <tcpTransport portSharingEnabled="false" listenBacklog="10" maxPendingAccepts="10" maxPendingConnections="10" /> </binding> <
  • 错误请求错误 400 - WCF 客户端(Bad Request Error 400 - WCF Client)
    问题 我有一个 WCF Web 服务在我的 IIS 上运行。 它从客户端获取数据并插入到数据库中。 我的 Web 服务需要一个复杂数据类型播放器的对象。 在客户端中,我创建了一个 Players 对象并将其传递给 Web 服务来完成工作。 在我的客户端控制台应用程序中,我正在做 string strBaseAddress = ConfigurationSettings.AppSettings["WEBSERVICE"]; Uri baseAddress = new Uri(strBaseAddress); WebServiceHost host = new WebServiceHost(typeof(TrialCenterAPI), baseAddress); host.open // Doing Work host.close 这个应用程序运行良好。 现在当我编写另一个客户端时,通过添加一个服务引用来做同样的工作。 它每次都给我 400 Bad Request Error。 我创建了自动生成的 API Client 对象,然后调用相应的 Web 服务方法并将 Players 对象传递给它。 我尝试谷歌搜索,但没有得到任何解决方案。我增加了服务器和客户端 Web 配置中的最大大小。 客户端 Web Config 使用自定义绑定如下: <system.serviceModel>
  • 在点击 WCF 服务之前添加检查 [重复](add a check before hitting a WCF service [duplicate])
    问题 这个问题在这里已经有了答案: 8 年前关闭。 可能的重复: WCF API 部署版本控制 我正在研究 WCF Rest 服务。 我有几个服务。 现在,在客户端点击服务之前,我想添加一个检查即。 一个版本号。 如果版本号小于(假设为 2.0),则客户端应用程序应收到错误“应用程序已过时”并且不应访问服务。 我的主要目的是,我不想在每个 Web 服务中应用此检查。 我想要一些通用服务,它首先检查版本,然后只允许客户端访问所需的服务。 如何才能做到这一点。 此外,这是否可以在 .NET 中的经典 Web 服务中实现。 回答1 我认为这是一个非常糟糕的主意 - 您需要创建一个集中式服务,该服务以某种方式知道所有服务端点的所有版本详细信息,然后要求您的消费者进行额外调用以使用您的服务。 这会造成单点故障,因为如果“版本检查器”服务不可用,那么“有效”消费者(具有正确客户端版本的消费者)仍将无法调用您的服务。 此外,您还需要在此中心位置维护每个服务的当前版本,这会产生支持开销。 对您的服务进行版本控制的最佳方法是尝试进行不间断的更改,以便可以支持旧版本的客户端。 你可以通过多种方式做到这一点。 我之前在这里和这里都发布过这个。 如果您必须进行重大更改,那么您要么需要让您的消费者中断(因此被迫升级),要么在不同端点共同托管不同版本的服务。 注意:有些东西是专为您的想法而设计的,称为
  • WCF HttpTransport:流式vs缓冲式TransferMode(WCF HttpTransport: streamed vs buffered TransferMode)
    问题 我有一个自托管的WCF服务(v4框架),该服务通过基于HttpTransport的自定义绑定公开。 绑定使用自定义MessageEncoder ,该自定义MessageEncoder几乎是BinaryMessageEncoder ,并且具有gzip压缩功能。 Silverlight和Windows客户端使用Web服务。 问题:在某些情况下,服务在响应多个并发请求时必须返回非常大的对象,并偶尔抛出OutOfMemory异常(即使任务管理器报告了该过程的〜600 Mb)。 异常发生在自定义编码器中,当消息即将被压缩时,但是我相信这只是一种症状,而不是原因。 异常显示“未能分配x Mb”,其中x为16、32或64,不是一个太大的数字-出于这个原因,我认为在此之前,其他因素已经使过程接近某个限制。 服务端点定义如下: var transport = new HttpTransportBindingElement(); // quotas omitted for simplicity var binaryEncoder = new BinaryMessageEncodingBindingElement(); // Readerquotas omitted for simplicity var customBinding = new CustomBinding(new
  • 通信对象System.ServiceModel.Channels.ServiceChannel无法用于通信(The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication)
    问题 通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它处于故障状态。 这个错误到底有什么意义,我将如何解决呢? 回答1 之所以会收到此错误,是因为您在服务器端发生了.NET异常,并且您没有捕获并处理它,也没有将其转换为SOAP错误。 现在,由于服务器端被“炸毁”,WCF运行时已经“破坏”了通道-例如,客户端和服务器之间的通信链接不可用-毕竟,看起来您的服务器刚刚被炸毁,因此您无法与之通信它了。 因此,您需要做的是: 始终捕获并处理服务器端错误-不要让.NET异常从服务器传播到客户端-始终将这些错误包装为可互操作的SOAP错误。 签出WCF IErrorHandler接口,并在服务器端实现它如果您要从客户端向您的频道发送第二条消息,请确保该频道未处于故障状态: if(client.InnerChannel.State != System.ServiceModel.CommunicationState.Faulted) { // call service - everything's fine } else { // channel faulted - re-create your client and then try again } 如果是这样,您所能做的就是处置它,然后重新创建客户端代理,然后重试。 回答2
  • 如何降低 WCF 命名管道的完整性(How to lower integrity of WCF named pipe)
    问题 我有一个用 C# 编写的 Internet Explorer 加载项,它通过 WCF 命名管道与 .NET 桌面应用程序对话。 桌面应用程序为 netNamedPipeBinding 创建 ServiceHost,IE 加载项的每个实例创建一个 ChannelFactory 以与应用程序对话。 在 Windows XP 下一切正常,但在 Windows 7 的 IE 保护模式下抛出异常。 System.ServiceModel.CommunicationException:无法连接到端点“net.pipe://localhost/MyApp.MyID”。 ---> System.IO.PipeException: '\.\pipe...guid...' 存在管道端点,但连接失败:访问被拒绝。 (5, 0x5) 在保护模式下运行加载项是我必须支持的方案。 我的理解是,如果我降低命名管道的完整性级别,那么我的 IE 加载项将被允许通过它进行通信。 我的问题是如何做到这一点。 我已经设置了使用 WCF 的东西,并且最好保持这种方式。 我可以让 WCF 创建具有较低完整性级别的命名管道吗? 我写什么代码来实现这一点? 回答1 我不认为这是可能的。 问题是必须在创建命名管道时提供的安全描述符中指定完整性标签。 在标准 NetNamedPipeBinding 中
  • 在 impersonate=true 的网站中使用 WCF 的 net.pipe(Using WCF's net.pipe in a website with impersonate=true)
    问题 我正在尝试在网站中使用 WCF 命名管道,但失败并出现错误: 在 net.pipe://localhost/mypipename 上没有侦听端点可以接受消息。 这通常是由不正确的地址或 SOAP 操作引起的。 有关更多详细信息,请参阅内部异常(如果存在)。 和内部异常: The pipe name could not be obtained for net.pipe://localhost/mypipename. 并且还有另一个内部异常给出access denied消息。 我的网站正在使用模拟,并环顾互联网,这似乎是相关的,但我不知道如何修复它。 有没有人有任何想法? 谢谢马特 回答1 标准 WCF NetNamedPipesBinding 在服务启动时创建一个随机生成的管道名称,以及一个内核共享内存对象,WCF 客户端通道堆栈必须查询该对象以找出管道名称。 在您的网站上使用模拟意味着从中调用您的 WCF 服务的安全上下文具有一个登录令牌(模拟令牌),其中包括 NETWORK USERS 组的成员身份。 当服务侦听器启动时,WCF 绑定会在命名管道本身和发布管道名称的共享内存对象上创建访问控制列表 (ACL)。 这两个 ACL 都拒绝访问 NETWORK USERS 组。 因此,冒充远程用户的网站在发现管道名称之前就被拒绝访问共享内存对象。 即使它以其他方式发现管道名称
  • WCF中带有“无法识别的序列”消息的CommunicationException(CommunicationException with 'not recognized sequence' message in WCF)
    问题 使用WCF服务时收到CommunicationException。 消息是: 远程端点不再识别此序列。 这很可能是由于远程端点中止。 wsrm:Identifier的值不是已知的序列标识符。 可靠的会话有故障。 在调用contract方法之后的一瞬间引发了异常。 在调用合同方法之前,通道状态为“打开”。 捕获此异常后,我恢复了我的服务客户端,一段时间后,它可以正常工作。 但是然后再次发生此错误。 似乎已经超过了某个超时时间,但是我无法确切地了解哪个超时时间。 我使用启用了secureSession的wsHttpBinding。 InactivityTimeout设置为半小时,我敢肯定它没有超过,因为更早抛出了异常。 回答1 我解决了问题。 原因是服务器端的RecieveTimeout。 它设置为1分钟,因此在1分钟内没有任何请求后,服务器用来关闭通道,并且当客户端尝试调用合同时,由于超时,通道已经崩溃。 阅读本文后,我找到了解决方案: http://msdn.microsoft.com/zh-CN/library/system.servicemodel.reliablesession.inactivitytimeout.aspx 回答2 设置新的WCF服务并返回对象列表时,我收到此错误。 我的理解是WCF服务只能将非常简单的对象来回传递。 因此
  • WCF 异常:找不到与端点的方案 http 匹配的基地址(WCF Exception: Could not find a base address that matches scheme http for the endpoint)
    问题 我正在尝试在 IIS 中的单独网站上托管 WCF Web 服务,并将 https 443 作为唯一绑定。 当我在同时使用绑定 (http(80) / https(443)) 的网站中使用它时,以下配置效果很好。 如果我删除 http 绑定,它会开始抛出以下错误。 无法找到与具有绑定 BasicHttpBinding 的端点的方案 http 匹配的基地址。 注册的基地址方案是 [https]。 如何使其在仅具有 https 绑定的 IIS 网站中工作? <system.serviceModel> <bindings> <basicHttpBinding> <binding name="defaultBasicHttpBinding"> <security mode="Transport"> <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> <message clientCredentialType="Certificate" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost
  • WCF跟踪。 如何获得关闭连接的确切原因?(WCF Tracing. How I can get the exact reason for closing connection?)
    问题 在我的WCF服务中,尝试传输大数据时,我不断收到错误消息:基础连接已关闭:连接意外关闭 我想知道是什么原因导致此错误,因此我设置了WCF跟踪并可以读取traces.svclog文件。 问题是,我可以在此文件中看到许多有关流程流的信息,可以看到出现异常的确切时间,但是我看不到其确切原因。 是由于MaxReceivedMessageSize还是类似的原因。 是因为traces.svclog不能包含此类信息,还是我做错了什么? 如何获得此类信息? 编辑(添加): 在我的服务器端app.config中: <system.serviceModel> <bindings> <basicHttpBinding> <binding name="NAVBinding_ICustomer_Service" closeTimeout="01:50:00" openTimeout="01:50:00" receiveTimeout="01:50:00" sendTimeout="01:50:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
  • WCF maxConnections 属性(WCF maxConnections property)
    问题 我有一个用 .net 4 编写的 WCF 服务,并通过 net.tcp 公开。 任何时候我尝试将绑定配置的 MaxConnections 属性设置为高于 10 的值时,我都是 AddressAlreadyInUseException。 为什么会在 MaxConnection 设置中抛出这个问题? (如果重要的话,我使用的是带有 4 核 CPU 和 4 GB 内存的 Server 2008 R2 Standard) <binding name="NetTcpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transferMode="Buffered" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxBufferSize="25000000" maxReceivedMessageSize="25000000" maxConnections="50"> <readerQuotas maxDepth="32" maxStringContentLength="25000000" maxArrayLength="25000000"
  • 对流端点的 WCF 服务服务调用在第三次调用时失败(WCF Service service call to stream endpoint fails on 3rd call)
    问题 快速概述我在这里的内容: WCF Soap 服务通过 HTTPS 运行,具有证书类型的消息凭据。 我有 2 个端点(除了 mex),1 个用于我的正常服务调用,另一个用于流文件。 这是我的服务的 web.config(编辑了一些项目名称): <bindings> <wsHttpBinding> <binding name="wsHttpEndpointBinding"> <security mode="TransportWithMessageCredential"> <message clientCredentialType="Certificate" /> </security> </binding> </wsHttpBinding> <basicHttpBinding> <binding name="streamBinding" transferMode="Streamed" messageEncoding="Mtom" maxReceivedMessageSize="2147483646"> <security mode="TransportWithMessageCredential"> <message clientCredentialType="Certificate" /> </security> </binding> </basicHttpBinding> <
  • WCF给出了不安全的或不正确的安全错误(WCF gives an unsecured or incorrectly secured fault error)
    问题 我正在尝试使用远程svc Web服务。 我使用svcutil.exe创建了代理类,然后将该类添加到控制台应用程序中,但是会产生错误: 从另一方收到不安全的错误或不正确的安全错误。 有关故障代码和详细信息,请参见内部故障异常。 System.ServiceModel.FaultException:验证消息的安全性时发生错误 我没有创建WCF端,它是一个远程svc。 请帮忙。 <?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="EloquaDataTransferService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize=
  • 如何正确配置 WCF NetTcp 双工可靠会话?(How do I correctly configure a WCF NetTcp Duplex Reliable Session?)
    问题 请原谅明显的自我问答,但此信息被广泛误解,并且几乎总是错误地回答。 所以我想把这些信息放在这里,供人们寻找这个问题的明确答案。 即便如此,仍有一些信息我无法确定。 我会把这个放在问题的末尾(如果你对序言不感兴趣,请跳到那个)。 如何正确配置 WCF NetTcp 双工可靠会话? 关于这个主题有很多问题和答案,几乎所有的问题和答案都建议在您的配置中设置inactivityTimeout="Infinite" 。 这似乎并不能正常工作,特别是对于 NetTcp 的情况(它可能适用于 WSDualHttp 绑定,但我从未使用过这些)。 还有许多其他问题通常与此相关:包括,客户端或服务器意外断开后通道没有故障,10 分钟后通道断开连接,通道随机断开连接......尝试打开时通道抛出异常......无法在同一端点上配置元数据... 请注意:下面有两个重要的概念。 基础结构消息是 WCF 通信方式的内部消息,框架使用它来保持事情顺利运行。 操作消息是因为你的应用做了一些事情而发生的消息,比如通过网络发送消息。 基础设施消息在很大程度上对您的应用程序是不可见的(但它们仍然出现在后台),而操作消息是您的应用程序执行操作的结果。 通过来之不易的反复试验,我发现了一些信息。 Infinite似乎并不是在所有情况下都是有效的配置设置(当然,visual studio 验证架构不知道它)。
  • 当WCF客户端为同一合同指定多个终结点时会发生什么?(What happens when a WCF client specifies multiple endpoints for the same contract?)
    问题 它会从所有人身上消耗吗? 会抛出异常吗? 回答1 您可以在clieint配置中为同一合约和不同地址设置多个端点,这没有问题。 它们需要由<endpoint>标记上的唯一name=属性分隔。 <client> <endpoint name="tcpEndpoint" address="net.tcp://server:8888/SomeService" binding="netTcpBinding" contract="IYourService" /> <endpoint name="httpEndpoint" address="http://server:8777/SomeService" binding="basicHttpBinding" contract="IYourService" /> </client> 创建客户端代理时,需要提供要使用的端点的名称: YourClient client = new YourClient("netTcpEndpoint"); 您不能再实例化您的客户端并期望它找到要使用的“端点”,因为存在多个端点(不幸的是,如果没有指定任何内容,则无法将一个定义为“默认”端点)。 除此之外,我认为不会出现任何问题。