如何使用表单身份验证和安全性验证WCF调用

时间:2011-01-10 07:14:52

标签: wcf security wcf-security

我正计划为跨越多台计算机的分布式应用程序进行设置,并使用WCF在其间发送数据。

机器A

机器B

机器C

计算机B和计算机C上的WCF服务应检查来自计算机A的请求是否已经过身份验证。如何检查请求是否在不同的计算机上进行了身份验证?

我只关心请求是否经过身份验证,而不关心保护邮件正文(因为我们没有通过网络发送任何敏感数据),因此不需要SSL。

我可以在上述场景中使用哪些身份验证方法?

2 个答案:

答案 0 :(得分:5)

这取决于您的解决方案应该是多么复杂和安全。 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上执行任何操作。

答案 1 :(得分:0)

典型的设置是机器A使用单个技术用户连接到机器B和C上的WCF服务。对于该用途,要么将用户名和密码放在机器A的配置文件中,要么使用Windows身份验证。所有机器都在同一个域内。

机器B和C只会信任请求已经过身份验证的机器A.