如何安全地验证WCF服务方法的调用程序集?

时间:2010-06-14 08:56:35

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

目前的情况如下: 我们有一个生产.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;显然,结论是,以安全的方式实施是根本不可能的。

2 个答案:

答案 0 :(得分:0)

听起来像是你需要将安全性转移到单独的服务中...沿着更加联合的路线走这条路,你可以使用公钥和私钥来实现握手形式的加密,以便在两者中生成安全的会话令牌的情况。

通过这种方式,你仍然可以同时获得两个窗口的验证和自定义解决方案,同时保留安全方法的属性(我假设您正在以这种方式实现它。)

听起来像是一项相当多的工作 - 我必须从头开始做这个并遇到一些跨域/委托问题。但我相信这个想法很好。

如果你最终得到一个很好的基于声明的基于secuirty的模型

答案 1 :(得分:0)

您可以获得来电者地址:

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