ASP.NET网站+ Windows窗体应用程序+ WCF服务:客户端凭据

时间:2008-12-05 22:39:20

标签: asp.net wcf authentication architecture

假设我正在考虑设计一个WCF服务,其主要目的是提供可供三个不同应用程序使用的广泛服务:面向公众的Web站点,内部Windows窗体应用程序和无线移动设备。该服务的目的有两个:(1)在中央位置合并与业务流程相关的代码,以及(2)锁定对遗留数据库的访问,最终一劳永逸地将其隐藏在一套服务之后。

目前,三个应用程序中的每一个都有自己的持久性和域层,同一数据库的视图略有不同。而不是所有三个应用程序都与数据库通信,它们将与WCF服务进行通信,从而启用某些客户端的新功能(移动选择器当前无法触发进程发送电子邮件),并集中通知系统(而不是对于新订单,计划任务每​​五分钟轮询一次数据库,只需在其中一个客户端调用AcceptNewOrder()服务方法时ping开销分页系统。总而言之,到目前为止听起来非常清醒。

然而,就整体设计而言,在安全方面我很难过。 Windows窗体应用程序目前只使用Windows主体;员工存储在Active Directory中,在应用程序启动时,他们可以以当前Windows用户身份登录(在这种情况下不需要密码),也可以提供他们的域名和密码。移动客户端没有任何用户概念;它与数据库的连接是一个硬编码字符串。该网站有数千个用户存储在旧数据库中。那么如何实现身份模型并配置WCF端点来处理这个?

就Windows窗体应用程序而言,这不是一个大问题:WCF代理可以启动一次并且可以在内存中闲逛,所以我只需要一次客户端凭据(并且如果代理曾经可以再次提示它们故障)。移动客户端可以是特殊的,并使用X509证书对WCF服务进行身份验证。但是我该如何处理这个网站呢?

在网站的情况下,允许匿名访问某些服务。对于需要在假设的“客户”角色中进行身份验证的服务,我显然不希望在每个请求上对它们进行身份验证,原因有两个:

  • 我每次都需要他们的用户名和密码。几乎可以在任何地方存储这对信息 - 会话,加密的cookie,月亮 - 似乎是一个坏主意。
  • 我必须针对每个请求点击数据库中的users表。哎哟。

我能想出的唯一解决方案是将网站视为受信任的子系统。 WCF服务需要来自Web站点的特定X509证书。该网站在内部使用表单身份验证(在返回布尔结果的服务上调用AuthenticateCustomer()方法),可以在凭据列表中添加其他声明,例如“joe@example.com已登录作为顾客。“然后以某种方式可以在具有该声明的服务上构建自定义IIdentity对象和IPrincipal,WCF服务确信该网站已经正确地验证了该客户(它将知道该声明尚未被篡改,至少,因为它会提前知道网站的证书。

有了所有这些,WCF服务代码就可以说出[PrincipalPermission.Demand(Role=MyRoles.Customer)][PrincipalPermission.Demand(Role=MyRoles.Manager)]之类的内容,Thread.CurrentPrincipal会有代表用户的内容(e客户的邮件地址或员工的专有名称,这两者都可用于记录和审核。

换句话说,每个服务都会存在两个不同的端点:一个接受着名的客户端X509证书(用于移动设备和网站),另一个接受Windows用户(用于员工)。

对不起,这太久了。所以问题是:这有什么意义吗?提议的解决方案是否有意义?我是不是太复杂了?

2 个答案:

答案 0 :(得分:15)

答案 1 :(得分:0)

对于anonymouse公共访问,请使用basichttpbinding,并在web.config文件中包含以下内容