有一个托管在IIS 7上的WCF .NET 4服务。
该服务将被两种类型的客户端访问:
1. Silverlight客户端(稍后将创建) 2. 三个C# .NET 4控制台应用程序(已创建并测试)
为了访问这个WCF服务,我创建了一个简单的包装器dll(我不使用Visual Studio自动生成的引用来避免在多个项目中更新它们,但我使用自动生成的引用作为我的包装器模板)。
这就是我的包装器的样子:
class MyServiceClient : System.ServiceModel.ClientBase<IMyService>,
IMyService
它基本上将所有调用转发到base.Channel。
现在我们开始考虑实现身份验证。我们的IIS和控制台应用程序不能保证位于同一域中,因此Windows Auth不是可选项。显然,我们将不得不在控制台应用程序的应用程序配置文件中存储用户名/密码,并且WCF将根据我们的用户数据库进行检查。
逐条消息身份验证似乎有点太耗费流量和资源 - 然后我们将不得不在每次调用时从我们的DB中选择用户。我们的控制台应用程序是计划任务,它们可能运行整天并发出数千个WCF请求。因此,我们需要某种经过身份验证的用户会话。
我也担心如果我的System.ServiceModel.ClientBase意外断开连接会发生什么。当前(没有任何身份验证),ClientBase能够重新连接而无需引起任何问题。在添加身份验证实现之后,我希望保持相同的行为。客户端应该能够重新登录而不向调用应用程序抛出任何异常。
据我所知,为了允许所有ASP.NET会话好处在WCF中,我必须以ASP.NET兼容模式运行,并确保每个用户都有自己的线程和自己的Thread.CurrentPrincipal。但我不知道如何确保如果连接中断/服务器重新启动,登录将自动更新。我需要为每个方法调用添加try.catch并且在出现SecurityException时重新登录吗?这似乎是一种有点不好的解决方案。
现在我可以总结两个问题:
我有哪些选项可供在IIS WCF服务和控制台应用程序之间进行经过身份验证的自动恢复会话?
如何以一种方式实现身份验证会话,使得我的WCF服务客户端包装器能够在断开连接时恢复/创建新会话?
如果Silverlight不支持wshttpbinding,并且由于安全原因,WCF不允许通过basichttpbinding传递用户凭据,则如何以安全的方式实现身份验证? 我找到了以下文章: http://www.dotnetcurry.com/ShowArticle.aspx?ID=589,它解释了如何通过自定义绑定使Silverlight使用SSL,但我不知道如何将我的auth会话放入其中,以便它也可以用于控制台应用程序。