2012-07-23 22 views
3

我有以下情形。针对长时间运行的应用程序的WCF验证会话

有一个WCF .NET 4服务,托管在IIS 7

该服务将两个类型的客户端进行访问:

  1. Silverlight客户端(将在后面创建)
  2. 三个C#.NET 4控制台应用程序(已创建和测试)

要访问此WCF服务,我创建了一个简单的包装DLL(我不使用Visual Studio自动生成引用以避免在我的WCF更改时在多个项目中更新它们,但我使用自动生成的引用作为包装的模板)。

这是我的包装看起来像:

class MyServiceClient : System.ServiceModel.ClientBase<IMyService>, 
     IMyService 

它基本上转发所有的呼叫base.Channel。

现在我们开始考虑实现身份验证。我们的IIS和控制台应用程序不保证位于同一个域中,因此Windows验证不是一个选项。很显然,我们必须在用于控制台应用程序的应用程序配置文件中存储用户名/密码,并且WCF将根据我们的用户数据库对其进行检查。

每消息认证似乎有点太流量和资源沉重 - 那么我们将不得不在每次调用时选择用户形式我们的数据库。我们的控制台应用程序是计划任务,他们可能整天运行并发出数千个WCF请求。所以我们需要某种认证的用户会话。

另外我很担心如果我的System.ServiceModel.ClientBase意外断开会发生什么。目前(没有任何身份验证),ClientBase能够无提示地重新连接,没有任何问题。我想在添加auth实现后保持相同的行为。客户端应该能够静默地重新登录,而不会向调用应用程序抛出任何异常。

据我所知,为了在WCF中允许所有ASP.NET会话的好处,我必须在ASP.Net兼容模式下运行,并确保每个用户都有自己的线程和自己的Thread.CurrentPrincipal。但我不知道如何确保如果连接中断/服务器重新启动,登录将自动重新引导。我是否需要为每个方法调用添加tr..catch,并在出现SecurityException时重新登录?似乎有点肮脏的解决方案。

现在我可以总结一下两个问题:

我有IIS WCF服务和控制台应用程序之间的身份验证自动恢复原状会议有哪些选择?

如何以某种方式实现身份验证会话,以便我的WCF服务客户端包装能够在断开连接的情况下恢复/创建新会话?

如果Silverlight不支持的WSHttpBinding和WCF不允许用户凭据传递了basicHttpBinding的(由于安全原因),那我怎么才能实现我的身份验证安全的方式? 我找到以下文章: http://www.dotnetcurry.com/ShowArticle.aspx?ID=589 它解释了如何使Silverlight通过自定义绑定来使用SSL,但我不知道如何将我的auth会话放在它中,所以它也可用于控制台应用程序。

回答

0

您可以使用SSL证书来验证您的WCF应用程序中的客户端/服务器。实际上,您可以使用SSL证书来提供传输级别的安全性(因此不需要消息加密/解密业务),并且还可以使用该证书对客户端进行身份验证,说明它是谁,服务器是谁说的。

这种方法的唯一缺点是您的客户需要了解您的SSL证书,并根据您的设置,他们可能还需要您的证书副本。

希望这会有所帮助!

相关问题