我正在使用自定义UserNamePasswordValidator,它实例化并登录到我们的内部API。
此API公开了当用户被“踢”(由另一个管理用户)时触发的事件,并且我想通过终止WCF会话来响应此事件,以便进一步调用抛出异常。
我该怎么做?
我的WCF服务托管在Windows服务(而不是IIS)中。实例化和登录内部API需要相当长的时间,因此我不能在每次服务调用时都这样做。
答案 0 :(得分:0)
如果您希望该服务使用用户名和密码对每个用户调用进行身份验证,那么您的验证程序中可以包含任何代码。但是,如果您希望使用每个会话服务实例,您可能还会使用安全上下文(安全会话)。在这种情况下,只有第一个请求由验证器验证,后续请求由在建立安全上下文期间生成的令牌验证。
修改强>
每个正在运行的服务都由InstanceContext类表示。如果您有PerSession服务,则InstanceContext对于每个调用都是相同的。如果您在某处存储对InstanceContext的引用,您应该能够释放实例并关闭会话 - 我从未尝试过,但它应该是可能的。
答案 1 :(得分:0)
我在http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx找到了一些代码,展示了如何使用自定义ServiceCredentials
类,并从那里将用户的详细信息一直传递到Thread.CurrentPrinciple
。
从该代码开始,我在自定义主体对象中隐藏了Connection对象,这意味着我可以在会话上下文中找到它。然后,我添加了一个自定义CodeAccessSecurityAttribute
,用于检查连接对象以查看它是否已断开连接。如果有,则抛出异常,从而终止用户的会话。