使用WCF,我如何确保只有可信组件才能调用我的服务?

时间:2013-05-23 12:42:12

标签: c# .net wcf security servicecontract

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

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

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

我需要知道谁在拨打这项服务。

基本上,出于安全原因,我需要拒绝来自未经我签名的任何集会的IHello.Echo号调用。 <{1}}方法不应对不受信任的呼叫者可用。

我依稀记得在旧的.NET 1远程日中,我们可以走栈并检查呼叫者的身份。但是我怎么能用WCF做到这一点?

3 个答案:

答案 0 :(得分:1)

您无法验证来电者程序集。服务的调用者驻留在您无法访问的其他进程中。

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

答案 1 :(得分:0)

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

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

您可以使用web.config的ServiceCredentials部分执行此操作...您在选择证书时非常灵活。如果您想要锁定谁可以拨打该服务,我建议您这样做。

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

对评论的回应:

是的,公平。但是,在受信任程序集的情况下,恶意用户可以简单地复制程序集。所以我认为你是略微草编。一个涉及反向工程,另一个需要xcopy。

鉴于您的新要求:

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

如果您想要一台安全的计算机将其锁在保险箱中,将其转移到海洋中,那么计算机就有一种说法。从逻辑上讲,安全性是不可能的 - 您只需要确定攻击者想要的长度。

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

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

答案 2 :(得分:0)

我也遇到过同样的问题:

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

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