【问题标题】:With custom UserNamePasswordValidator, can I kill the user's WPF "session"?使用自定义 UserNamePasswordValidator,我可以终止用户的 WPF“会话”吗?
【发布时间】:2010-09-22 16:08:56
【问题描述】:

我正在使用自定义 UserNamePasswordValidator,它实例化并登录到我们的内部 API。

此 API 公开了一个在用户被“踢”(被另一个管理用户)“踢”时触发的事件,我想通过终止 WCF 会话来对此做出响应,以便进一步的调用引发异常。

我该怎么做?

我的 WCF 服务托管在 Windows 服务(不是 IIS)中。实例化和登录到内部 API 需要相当长的时间,所以我不能在每次服务调用时都这样做。

【问题讨论】:

    标签: wcf wcf-security


    【解决方案1】:

    如果您希望该服务使用用户名和密码对每个用户调用进行身份验证,那么您可以在验证器中使用任何代码。但是,如果您希望使用每个会话服务实例化,您可能还会使用安全上下文(安全会话)。在这种情况下,只有第一个请求由验证器验证,后续请求由在建立安全上下文期间生成的令牌验证。

    编辑:

    每个正在运行的服务都由 InstanceContext 类表示。如果您有 PerSession 服务,则每次调用的 InstanceContext 都是相同的。如果您在某处存储对 InstanceContext 的引用,您应该能够释放实例并关闭会话 - 我从未尝试过,但它应该是可能的。

    【讨论】:

    • 我正在使用按会话实例化,因为登录到我们的 API 很昂贵。问题仍然存在:如何撤销会话?
    • 您使用哪种绑定? PerSession 实例化依赖于其他一些会话类型——传输、安全或可靠。
    • 无论我需要哪种绑定:我控制客户端和服务器。
    【解决方案2】:

    我在http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx 找到了一些代码,它显示了如何使用自定义ServiceCredentials 类,并从那里将用户的详细信息一直传递到Thread.CurrentPrinciple

    从该代码开始,我将 Connection 对象隐藏在自定义主体对象中,这意味着我可以在会话上下文中访问它。然后,我添加了一个自定义的CodeAccessSecurityAttribute,它检查该连接对象以查看它是否已断开连接。如果有,则会引发异常,从而终止用户的会话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2011-04-04
      • 2013-05-08
      相关资源
      最近更新 更多