【问题标题】:How to secure a webservice in .net?如何保护.net 中的网络服务?
【发布时间】:2009-05-06 12:42:11
【问题描述】:

我编写了一个简单的 .NET 网络服务,我将托管在不同的服务器上,可能位于不同的大陆。我真的不知道。现在,我只有它的 URL,我尝试使用 webrequest 和 webresponse 方法来访问那个 web 服务 vai HTTP POST。现在,我想知道有没有什么方法可以保护 web 服务访问,这样没有人可以利用它?

例如:

http://example.com/Verify/Verification.asmx/Verify?AccountNumber=3223&ProductName=876

现在,这些是调用此 Web 服务所需的所有参数。好像现在,任何人都可以利用它。那么我怎样才能使它安全呢?虽然,我打算获得 SSL,而这整个过程是从服务器到服务器,而不是从客户端到服务器?

【问题讨论】:

  • 谢谢大家.. 编码愉快。

标签: .net web-services security


【解决方案1】:

您可以在 Web 请求的授权标头中传递服务密钥(很像 Amazon WS),该服务密钥可以使用您选择的算法进行加密,然后在服务端解密,并且仅在以下情况下继续执行关键匹配

请参阅以下 URL 中的第 14.8 节

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

【讨论】:

  • 谢谢,有道理。还有什么其他的事情,我可以做些什么来使它更安全?如果来自客户端的请求是在 SSL 模式下完成的,那么这个请求也将在 SSL 中从服务器到服务器完成,还是我必须专门打开它?原谅我,问了这么多问题。谢谢。
  • 我相信您还需要一个 SSL 证书才能进行服务器到服务器的通信。与加密的授权标头配对应该是您所需要的全部
【解决方案2】:

很遗憾,您没有太多选择,因为您使用的是旧的 ASMX Web 服务技术。通过 Internet 使用 ASMX Web 服务对某人进行身份验证的唯一方法基本上是“自己动手”。

如果我必须这样做,我会使用 WCF 并给自己一些选择。如果我不能使用 WCF,那么我会创建一个自定义 HTTP 标头来传递用户名和密码(通过 SSL!),并在服务器上对它们进行身份验证。或者,我会在客户端上使用证书并要求将它们发送到服务器。 IIS 甚至可以将客户端证书转换为服务器上的 Windows 身份。

【讨论】:

  • WCF...我想我可以看看。但我仍然需要通过 URL 访问它,这是我的限制。如果可以,请你帮助我。任何链接就足够了。谢谢。
  • MSDN 上的 WCF 开发人员中心位于 msdn.microsoft.com/WCF。所有新的 Web 服务开发都应使用 WCF 而不是 ASMX。
【解决方案3】:

在 WCF 之前用于保护 .NET Web 服务的通常是 Microsoft 的 Web Service Extensions (WSE),现在是 3.0 版。我已经在一个市售的产品中成功地使用了它,它基于 W3C ws-* 标准,相当不错。如果您使用 Apache Axis,则可以成功地与 .NET 客户端(显然)以及 Java 客户端进行互操作。下载地址:

http://www.microsoft.com/downloads/details.aspx?FamilyID=018a09fd-3a74-43c5-8ec1-8d789091255d&displaylang=en

【讨论】:

  • 我强烈建议不要思考 WSE! WSE 已经过时,已被 WCF 取代。除非您别无选择,否则不要使用 WSE。
  • 这就是我写 /before/ WCF 的原因...最初的问题似乎是指传统的 .NET Web 服务。当然,如果有选择,我也会推荐 WCF。
  • 只是小心提及 WSE - 如果有人阅读本文决定使用它怎么办?这就是为什么我用如此鲜明的术语来形容它——“只有在你别无选择的情况下”。我不想让某人使用它,因为“它使用 .ASMX 文件”或“WCF 太高级”或类似的东西。 WSE 已过时,根本不应该使用,至少不应该用于任何重要的项目。
  • @john, @Guido:请原谅我的无知,但是 WSE 以什么方式失败?不安全吗?
  • @bnieland:WSE 已过时,几乎不受支持,已被 WCF 取代。几乎没有理由使用它。如果我必须在 Windows Server 2000 上运行并且需要 WS-Security,我只会使用它。如果由于某种原因您不能使用 WCF,那么只需使用 https。
【解决方案4】:

我们提供了相当多的 Web 服务,为了保护它们,我们只是在请求对象中添加了用户名和密码。在您的情况下,您可以为用户名和密码添加 2 个新参数,或者更简单地添加一个并使用身份验证代码之类的东西,您可以根据需要使其复杂或简单。

一些想法很简单,例如 GUID 列表,这些 GUID 是对请求服务器 IP 地址进行加密的可接受密钥,因此身份验证代码仅适用于 Web 服务验证的 IP 地址。

【讨论】:

  • 非常好.. 感谢您的建议.. 但正如其他人所说,我也会尝试使用 WCF,看看它是否对我有好处。否则,我总是可以使用你的建议。谢谢。
【解决方案5】:

您还可以创建一个令牌并将此令牌ID 作为参数传递给每个网络方法。您可以在哈希表中维护令牌,并在会话被放弃后从哈希表中删除。

成功登录后需要生成令牌。要生成令牌 ID,我建议使用 RNGCryptoServiceProvider

【讨论】:

  • 你说:你也可以创建一个token并将这个tokenid作为参数传递给每个webmethod。如果我按照您的指南在每个请求中传递令牌,那么我该如何防止附加回复。攻击者还获取这些令牌并发送请求。引导我。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多