用于长时间运行的应用程序的WCF身份验证会话

用于长时间运行的应用程序的WCF身份验证会话,wcf,session,authentication,Wcf,Session,Authentication,我有下面的场景 有一个WCF.NET 4服务,托管在IIS 7上 该服务将由两种类型的客户端访问: Silverlight客户端(稍后创建) 三个C#.NET 4控制台应用程序(已创建并测试) 为了访问这个WCF服务,我创建了一个简单的包装dll(我不使用Visual Studio自动生成的引用来避免在WCF更改时在多个项目中更新它们,但我使用自动生成的引用作为包装的模板) 这是我的包装的外观: class MyServiceClient : System.ServiceModel.Client

我有下面的场景

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

该服务将由两种类型的客户端访问:

  • Silverlight客户端(稍后创建)
  • 三个C#.NET 4控制台应用程序(已创建并测试)
  • 为了访问这个WCF服务,我创建了一个简单的包装dll(我不使用Visual Studio自动生成的引用来避免在WCF更改时在多个项目中更新它们,但我使用自动生成的引用作为包装的模板)

    这是我的包装的外观:

    class MyServiceClient : System.ServiceModel.ClientBase<IMyService>,
            IMyService
    
    类MyServiceClient:System.ServiceModel.ClientBase,
    IMyService
    
    它基本上将所有调用转发到base.Channel

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

    每条消息的身份验证似乎有点流量过大,资源过多-然后我们必须在每次调用时从数据库中选择用户。我们的控制台应用程序是计划任务,它们可能整天运行,并发出数千个WCF请求。所以我们需要某种经过身份验证的用户会话

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

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

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

    对于IIS WCF服务和控制台应用程序之间经过身份验证的自动恢复会话,我有哪些选项?

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

    如果Silverlight不支持wshttpbinding,并且WCF不允许通过basichttpbinding传递用户凭据(出于安全原因),那么如何以安全的方式实现身份验证? 我发现了以下文章:
    这解释了如何使Silverlight通过自定义绑定使用SSL,但我不知道如何将我的身份验证会话放入其中,以便它也可用于控制台应用程序。

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

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

    希望这有帮助