问题 调试重新启动后运行时,“安全上下文令牌无效或过期”


我有一个我正在编码的WCF应用程序。当我改变事物然后再次运行服务调用时,我会多次启动和停止它。

因为我需要会话信息我正在使用 wsHttpBinding

在我搬到之前 wsHttpBinding 我在用 basicHttpBinding 我可以停止服务,进行更改并重新启动它。然后我可以针对端点运行我的WCF测试客户端(WCF Storm),它仍然可以正常运行。

现在它告诉我:

邮件无法处理。这很可能是因为行动'http://tempuri.org/IMyService/MyOperation'不正确或因为邮件包含无效或过期 安全上下文令牌 或者因为绑定之间存在不匹配。如果服务由于不活动而中止了通道,则安全上下文令牌将无效。要防止服务中止空闲会话,请过早增加服务端点绑定的接收超时。

这意味着我必须刷新我的连接并重新设置我的服务调用(几百次后会变得烦人。)。

我读到安全超时是10分钟。我在不到2分钟内重新开始跑步,所以我认为这不是一个超时问题。

我的猜测是令牌因为我杀死并重新启动服务的明显原因而到期。

事情就是这样 我根本不需要安全的东西 (我只需要会话内容,或者我将使用BasicHttpBinding

反正有没有让我的WCF服务不关心安全上下文令牌?

注意: 我的测试客户端默认为wsHttpBinding并具有安全性设置。但我认为这是设置这个因为我的服务是发布它需要安全性。

我尝试过的事情:

  • 我尝试过类似于我发现的配置 这里

    <bindings>
        <wsHttpBinding>
            <binding name="WsEventLogBinding">
                <security mode="Message">
                    <message establishSecurityContext="false" />
                </security>
             </binding>
        </wsHttpBinding>
    </bindings>
    

但我真的不知道这意味着什么,或者它是否是我需要的东西(根本没有安全性(现在))。

这并没有消除这个问题。

  • 设置 <security mode="None">  这没有用。

13090
2018-05-15 22:07


起源

你能将解决方案发布到文件共享站点吗?这样我们就可以尝试复制问题并尝试许多不同的解决方案。谢谢 - AFischbein
还有,你看过这个: stackoverflow.com/questions/4767102/... - AFischbein


答案:


首先,你是真的:由于HTTP协议的无连接/无状态特性,basicHttpBinding不支持这一点。

但我认为你的WCF理解存在问题。

Session是WCF中的通用概念。有可能 基于安全的会话,其中通信的两端已达成一致的特定安全对话或 可靠的会议 其中消息可以配置为按顺序传送一次,确保即使消息在对话期间跨多个节点传输也能接收消息。

两种模式都允许您选择InstanceContextMode.PerSession。这真的是你想要的吗?

WCF安全依赖于相互身份验证;如果双方都信任另一方的凭证(基于声明),则可以建立安全上下文,其中所有消息在机密性中交换,并且所有消息都被签名以保护其完整性。安全会话是 独特 并且你不能在另一个对话中重复使用它。

以下是您的上下文的问题:问题不在 服务器端  但是 客户端。因为必须在客户端和服务上保留某些东西,重建服务将刷新服务上的整个WCF上下文(所有实例和会话将被处理)。没有与WCF会话相关联的通用数据存储(与asp的一个区别。 net session),所以重启会掉落一切。但是,客户端仍然认为由于其“无效”上下文而进行了身份验证。

要解决此问题,默认Wcf测试客户端上有此方案的复选框:“启动新代理”。在WCf Storm中,在引擎盖/杂项“总是创建新代理”中有一个通用配置。

注意:在生产中,您将永远不会有这种情况,因为您的服务将始终处于运行状态。

如果您关注我,您可能想尝试可靠的会话。你可以测试,但我不确定这是否有效。

<wsHttpBinding>
    <binding name="wsHttpBindingConfiguration">
        <security mode="None" />
        <reliableSession enabled="true" />
    </binding>
</wsHttpBinding>

重要的提示 :我不知道您的WCF级别,但在WCF中,客户端和服务必须具有同步配置(相同的安全性,会话设置,......)


11
2018-05-21 19:52



开始一个新的代理最终做了这个伎俩。谢谢! - Vaccano


wsHttpBinding具有安全性 默认启用。 尝试在绑定配置上使用此选项来禁用安全性:

<security mode="None">
   <transport clientCredentialType="None" />
    <message establishSecurityContext="false" />
</security>

另外,你的错误是wsHttpBinding相关。如果您使用会话并重新启动服务器,则 报告将显示安全错误消息

根据 MSDN

可靠的会话实现了WS-ReliableMessaging协议和   内存中传输窗口,用于屏蔽SOAP消息级故障和   在运输失败的情况下重新建立连接。

可靠的会话在发送方和接收方SOAP之间   端点,无论所需的传输连接数量   他们之间的连接。简而言之,TCP可靠性在哪里结束   传输连接结束,而可靠的会话提供   端到端的可靠性。

听起来像预期的行为。


4
2018-05-21 19:48





您可以使用基本的http绑定 TransportCredentialOnly security mode


0
2018-05-21 17:55



虽然这没有提供任何会话信息...我去更高级绑定的全部原因是获取会话信息。 - Vaccano


安全模式无应该完成这项工作。

<bindings>
    <wsHttpBinding>
        <binding name="WsEventLogBinding">
            <security mode="None" />
         </binding>
    </wsHttpBinding>
</bindings>

别忘了申请 bindingConfiguration="WsEventLogBinding" 在您的端点上。


0
2018-05-21 19:13