【问题标题】:How to authenticate WCF calls using forms authentication and secutity如何使用表单身份验证和安全性对 WCF 调用进行身份验证
【发布时间】:2011-01-10 07:14:52
【问题描述】:
我正计划为跨多台机器的分布式应用程序进行设置,并将使用 WCF 在其间发送数据。
机器 A
机器 B
机器 C
机器 B 和机器 C 上的 WCF 服务应检查来自机器 A 的请求是否已通过身份验证。如何检查请求是否在不同机器上进行了身份验证?
我只关心请求是否经过身份验证,而不关心消息正文的安全(因为我们不会通过网络发送任何敏感数据),因此不需要 SSL。
对于上述情况,我可以使用哪些身份验证方法?
【问题讨论】:
标签:
wcf
security
wcf-security
【解决方案1】:
这取决于您的解决方案应该有多复杂和多安全。 WCF 还可以根据成员资格提供程序验证用户。这种情况要求您将用户凭据传递给每个 WCF 服务调用,最后您将再次对每一层的用户进行身份验证。这将不起作用,因为 Web 应用程序仅对一个请求使用凭据,并且后续请求在 cookie 中具有身份验证令牌。但是 WCF 需要对每个调用进行身份验证。因此,当在 WCF 中使用成员资格提供程序时,您需要将用户凭据存储在机器 A 上的会话中。我真的不喜欢将客户端凭据存储在整个会话的内存中某处的想法。
我可能会使用类似的东西:
低安全场景:
您提到您正在构建分布式应用程序,因此您的层(机器 A - C)之间应该存在某种信任。机器 A 是否允许匿名访问?如果不是,您在机器 B 上的层是否可以信任机器 A 上的它对用户进行身份验证的层? C和B一样吗?在这种情况下,您根本不需要处理机器 B 和 C 上的身份验证,而是使用 Windows 安全性来仅允许访问运行客户端层的帐户(A 是 B 的客户端,B 是 C 的客户端)。
高安全场景:
这通常用于当您想避免有人在机器 A 上入侵网络并且在这种情况下对机器 B 上的所有操作进行身份验证或需要根据用户的原始身份进行授权时使用。
您不会在机器 A 上执行直接身份验证。相反,机器 A 上的自定义成员资格提供程序(或直接表单身份验证)将调用机器 B 上的身份验证服务。该服务将为“安全会话”创建令牌。根据实现,此令牌只能用于 A 和 B 之间的通信(您必须将其存储在会话中)或客户端 A 和 B 之间的整个通信(您将在 cookie 中传递它)。机器 C 信任机器 B。这可以进一步扩展到完全联合的场景。
这不会避免会话劫持(在客户端和机器 A 之间使用令牌嗅探 cookie - 为避免这种情况,您需要在客户端和 A 之间使用 HTTPS)但是没有令牌,黑客可以在您的机器 B 或 C 上做任何事情。
【解决方案2】:
典型的设置是机器 A 使用单个技术用户连接到机器 B 和 C 上的 WCF 服务。为此,可以将用户名和密码放入机器 A 的配置文件中,或者在以下情况下使用 Windows 身份验证所有机器都在同一个域内。
机器 B 和 C 将简单地信任机器 A,该请求已通过身份验证。