C# 保护Web服务

C# 保护Web服务,c#,web-services,protection,C#,Web Services,Protection,我有一个WebService项目,我们创建它是为了向我们的客户机公开一些方法(特别是如果他们调用其中一个方法,它将在我们的服务器上触发事件),他们可以在自己的C#项目中调用这些方法(一些客户机将执行web表单应用程序,一些客户机将在其内部网站上执行) 由于该方法的性质,其中一个参数是一个字符串,用于标识客户机是谁(因此我们可以触发适当的事件),我不太相信这足以阻止人们发送随机数据,直到他们偶然发现一个有效的标识符 保护这样的东西不被滥用的标准方法是什么?我发现的大多数教程似乎都没有提到任何关于保

我有一个WebService项目,我们创建它是为了向我们的客户机公开一些方法(特别是如果他们调用其中一个方法,它将在我们的服务器上触发事件),他们可以在自己的C#项目中调用这些方法(一些客户机将执行web表单应用程序,一些客户机将在其内部网站上执行)

由于该方法的性质,其中一个参数是一个字符串,用于标识客户机是谁(因此我们可以触发适当的事件),我不太相信这足以阻止人们发送随机数据,直到他们偶然发现一个有效的标识符


保护这样的东西不被滥用的标准方法是什么?我发现的大多数教程似乎都没有提到任何关于保护它们安全的内容。谢谢

您可能想查看协议

此协议包含有关如何在Web服务消息传递上强制执行完整性和机密性的规范

  • 使用用户名和密码应该很好
  • 如果您知道将调用webservice的计算机的客户端IP地址,请将URL限制为仅限于已知IP

  • 身份验证通常使用SOAP头进行处理,请参见MSDN页


    codeguru文章给出了一个例子,尽管它很旧。

    作为协议的一部分,您可以向客户端发送一个随机数。 然后,客户端将标识符与该随机数混合,并对组合值进行散列。 您可以将该组合值返回给服务器


    然后服务器计算相同的ID+数字哈希并验证这两个值。

    这实际上是一个密码。。。除了等待否,它在一个字段中包含用户名和密码

    不应该将用户名和密码组合到一个字段中,这本身并没有技术原因,但按照惯例,在没有额外密钥的情况下,它们是两个字段

    这有三个商业原因:

    • 帐户身份可以在应该知道用户身份(用户名?!)但不拥有密码的人之间明确讨论

    • 如果访问协议是传统的,那么在法律上证明未经授权的访问是最容易的,如果有必要的话,因为案例法更可能适用,情况也更可能明确(并导致更小的法律账单!)。在商业系统的公共网络上没有用户名并非闻所未闻,在某些系统中是一个好主意(但一般来说,这不是一个好主意)

    • 关于安全性最佳实践的指导原则一般和特定流程假定您使用用户名和密码,而不是在可能的情况下使用组合字段。这可能会使制定一致的政策变得更加困难

    密码(或密码部分,如果您使用组合用户名/密码字符串)将遵循所有关于更改策略、保密性、复杂性和长度的常见安全建议。我建议您也使用SSL和WS-Security,以便在安全领域尽可能保持常规。你可能需要在线路上加密

    编辑

    我的意思是写TLS而不是SSL

    编辑


    对不起,不,我指的是TLS或WS-Security。

    Daniel Vassallo是正确的。您需要使用X509证书来验证调用服务的人是否合法。然而,这确实大大提高了解决方案的复杂性。您将希望使用Microsoft WSE,并且可能需要购买第三方组件


    否则,您可以使用传入的用户名和密码。但是,需要有一些共享算法来根据日期、时间等散列信息。。如果没有散列,你将面临更多的黑客攻击。即使使用SSL,字典攻击也可能最终入侵。

    .NET 3.0以后的版本将放弃WSE以获取内置位。而且你也不需要第三方组件。您需要的是一个证书验证机制,或者您自己的证书服务器,用于颁发证书。