【问题标题】:How do I securely authenticate the calling assembly of a WCF service method?如何安全地验证 WCF 服务方法的调用程序集?
【发布时间】:2010-06-14 08:56:34
【问题描述】:

目前情况如下: 我们有一个生产 .net 3.5 WCF 服务,整个组织中的多个应用程序通过 wsHttpBinding 或 netTcpBinding 使用该服务。使用 Windows 集成安全性在传输级别上完成用户身份验证。该服务有一个方法Foo(string parameter),只能由给定AD组的成员调用。字符串参数是必须的。

一个新的客户端应用程序开始发挥作用(.net 3.5,C# 控制台应用程序),它消除了字符串参数的必要性。但是,只应允许来自此特定应用程序的调用省略字符串参数。服务器仍应知道客户端应用程序调用者的身份,因为 AD 组限制仍然适用(排除客户端的模拟)。

我找到了pass on the "evidence" of the calling (strong-named) assembly in the message headers 的方法,但这种方法显然不安全,因为“证据”很容易被欺骗。 此外,CAS(代码访问安全)似乎是一种可能的解决方案,但我似乎无法弄清楚如何在这种特定情况下使用 CAS。

有人对如何解决这个问题有建议吗?

编辑:我找到了another thread on this subject;显然,结论是根本不可能以安全的方式实施。

【问题讨论】:

  • 我还应该提到,客户端应用程序的反编译代码不应向黑客提供信息以模仿身份验证过程。

标签: c# wcf wcf-security wcf-client


【解决方案1】:

在我看来,您需要将安全性提取到单独的服务中……通过这种方式,您可以使用公钥和私钥实现握手形式的加密,从而在两者中生成安全会话令牌情况。

这样,您仍然可以同时使用 windows a=uthentication 和自定义解决方案,同时保留您在安全方法上的属性(我假设您正在以这种方式实现它。)

不过,这听起来像是一项相当大的工作——我不得不从头开始做这件事,并遇到了一些跨域/授权问题。但我相信这个主意不错。

但是你最终会得到一个很好的基于声明的安全模型

【讨论】:

  • 我必须说,自定义握手协议的想法在我脑海中闪过(不是很详细,但确实如此 :-)),但我放弃了它,因为我认为它需要太多的工作和更多问题……正如您的回答所证实的那样。然而,如果这是唯一的方法;我想我只能去争取了。您知道在 WCF 服务的上下文中描述这种基于声明的安全模型的任何页面吗?我仍然不清楚如何确保会话安全地验证我的客户端应用程序。
  • 沉迷于这个想法之后,我不禁想到,单独的服务将面临与我最初的相同的问题:该服务也需要安全地验证调用程序集以提供安全会话密钥。这个假设是正确的还是我遗漏了什么?
  • 我去度假了。好吧,我的假设是您不信任程序集的数据。使用异步加密,您可以轮换密钥,从而使密钥成为弱点。通过在服务器端轮换密钥,即使客户端不是 100% 安全,攻击者也没有足够的时间来利用它。因此,您可以有信心的唯一方法是使用某种受信任的握手。它远非完美,因为弱点在于客户使用的密钥和初始通信。但缺乏信心是你的定义。
  • 如果您能够定期重新发布程序集,那么您将为狡猾的人创造一场艰苦的战斗,因为您可以更新所有安全性 - 更改算法,更改密钥生成方式源数据等 - 通常让他的生活变得有趣。
【解决方案2】:

你可以得到来电者地址:

 RemoteEndpointMessageProperty clientAddress = 
    OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] 
as RemoteEndpointMessageProperty;
           string address = clientAddress.Address;

【讨论】:

  • 有趣的事实,但是客户端应用程序需要从大量机器上运行。客户地址肯定有助于在审计中提及。
猜你喜欢
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
相关资源
最近更新 更多