1

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

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

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

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

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

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

4

3 回答 3

1

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

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

于 2013-05-23T12:46:33.147 回答
0

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

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

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

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

回复评论:

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

鉴于您的新要求:

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

电脑有句俗话,如果你想要一台安全的电脑,就把它锁在保险箱里,把它扔到海里。保证安全在逻辑上是不可能的——你只需要确定你希望攻击者经历的长度。

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

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

于 2013-05-23T13:06:58.750 回答
0

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

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

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

于 2013-05-25T16:09:48.697 回答