【问题标题】:Using WCF, how can I make sure only trusted assemblies call my service?使用 WCF,如何确保只有受信任的程序集调用我的服务?
【发布时间】:2013-05-23 12:42:12
【问题描述】:

我有一个简单的服务合同,定义为:

[ServiceContact]
public interface IEcho
{
    [OperationContract]
    void Hello(string value);
}

在本地 WCF 服务中实现(通过net.pipe:// 地址访问)。

我需要知道谁在调用该服务。

基本上,出于安全原因,我需要拒绝任何未经我签名的程序集对IHello.Echo 的调用。 Hello 方法不应该对不受信任的调用者可用。

我依稀记得在旧的 .NET 1 远程处理时代,我们可以遍历堆栈并检查调用者的身份。但是如何使用 WCF 做到这一点?

【问题讨论】:

  • 我相信现在 WCF 中已经包含了安全措施,您可能需要阅读一些 materials on WCF security
  • 我已通读文档;似乎没有什么适合我的需要。如果 .NET 本身不能确保调用程序集的身份,那么我看不到如何实现我的目标。恶意调用者很容易模仿我添加到客户端 DLL 的任何安全措施(例如,证书不会有任何好处)。

标签: c# .net wcf security servicecontract


【解决方案1】:

您无法验证调用方程序集。服务的调用者驻留在您无权访问的不同进程中。

相反,您需要使用在 WCF 中提供客户端身份验证的任何解决方案。由于您使用的是命名管道,因此您应该研究消息级别的身份验证(而不是传输级别)。

【讨论】:

  • 消息级身份验证不提供关于调用者的任何真实保证:任何人都可以伪造证书或身份,只要获得对运行客户端程序集的机器的访问权限。
【解决方案2】:

在 WCF 中,如果您启用了身份验证,您可以询问 CLientCredentials 对象。

您还可以使用证书来保护服务...这样您就知道调用它的人已经获得了证书...这与签名程序集不同...但它与来自已知来源的认证调用者。

您可以使用 web.config 的 ServiceCredentials 部分来执行此操作……它在您选择证书的方式上非常灵活。如果您想锁定谁可以调用该服务,我建议这样做。

如果您想控制可以注册和取消注册的人员列表,而不是进行某种用户存储和身份验证。调用数据库的授权机制。

回复评论:

是的,很公平。然而,在具有受信任程序集的情况下,恶意用户可以简单地复制程序集。所以我认为你有点过分了。一个涉及逆向工程,另一个需要 xcopy。

鉴于您的新要求:

您需要编写某种身份验证器服务来生成伪随机序列,并使用可撤销的一次性使用证书进行某种握手来同步。有几个例子……您正在进入 STS 服务器和身份验证提供程序的领域。实际上,您可能希望一个窗口随着时间的推移重新同步,以及一个伪随机生成器,它可以快速吐出序列中的第 n 个数字。算法是存在的,但你正在进入这样一个领域,你需要非常有资格开始提供建议,而不需要 3 页说“不要引用我,这太难了”。我宁愿描述如何实现加密算法 tbh - 我也不会这样做。

计算机有句俗话,如果你想要一台安全的计算机,就把它锁在保险箱里,把它扔进海里。从逻辑上讲,要确保安全是不可能的——您只需要确定您希望攻击者通过的长度即可。

事实上,如果您处于信任状态,您应该知道从 mac 地址到 ip 再到证书的大量信息。您可以随时撤销这些凭据并重新建立它们。但是,如果有人提供了正确的凭据,那么说他们不是他们所说的那个人,就等于说椅子不是椅子——这是偏执狂。诀窍是收集证据来做出决定。

如果您想要防弹认证,请出去购买 - 这将花费您很多钱

【讨论】:

  • 恶意用户可以反编译我的客户端程序集,提取证书,在他自己的代码中使用它并假装是真正的客户端。这行不通。客户端和服务都在同一台机器上运行,但服务作为受信任的 Windows 服务(具有 LOCALSYSTEM 身份)运行。我看不出客户端如何以恶意用户无法模仿的方式向服务器证明其身份。
【解决方案3】:

我遇到过其他类似的问题:

显然,没有安全的方法来确保消息的发送者确实是一个特定的强签名程序集。恶意程序集总有某种方式可以欺骗其身份。

简而言之,答案是:不可能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多