Asmx Web服务:客户端身份验证

10

我有一个Web服务,里面有一堆方法,我希望能够在某种程度上加以保护。

虽然数据并不是非常机密,但我仍希望只允许使用存储在Web服务Web.config文件中的特定用户ID和密码的人员访问。每天或每周,一个C# Windows服务客户端将调用该Web服务。

有没有人可以提供一个简单的示例,说明我如何做到这一点?提前感谢。

2个回答

9
这与我的问题非常相似:"我们应该实现什么来授权客户使用我们的Web服务?" 我们最终没有发布WSDL,并通过https提供服务,要求使用基本身份验证。如果无法强制所有客户端使用https,请勿使用基本身份验证。
如果这是一个.NET Web服务,则以下是配置文件条目,可防止发布wsdl。
  <system.web>
    <webServices>
      <protocols>
        <remove name="Documentation" />
      </protocols>
    </webServices>
  </system.web>

当你访问该页面时,你会收到一个类似于手动从网站拉取web.config文件时收到的错误信息。正如Steven所指出的那样,这是通过模糊性来保护安全性,不应单独使用来保护您的Web服务。但是,当与基本身份验证+https一起使用时,它是一个不错的额外选择。 客户端代码: 要从客户端访问此Web服务,请按照正常方式添加您的Web引用,并在调用代码中(假设您的Web引用名称为WebRef)添加。
WebRef.Url = "url";
WebRef.Credentials = new System.Net.NetworkCredential("userid", "password");

此外,您可能需要了解WebRef.PreAuthenticate以节省一些往返。但是请注意,如果您在公司代理后面,测试这个功能可能会有些麻烦。WebRef通过代理使用。

WebRef.Proxy = new WebProxy("url");
WebRef.Proxy.Credentials = new System.Net.NetworkCredential("userid", "password");

这并不是一个不合理的额外步骤,但这是通过混淆来保证安全性,因为https本身并没有验证客户端,所以一旦服务器的URL被发现(而且它肯定会被发现),整个系统就会崩溃。话虽如此,要求使用https并使用基本身份验证是合理的。 - Steven Sudit
2
绝对不发布WSDL是通过模糊安全性来实现安全。但是,https +基本身份验证+一些内置于Web服务代码本身的安全性并非安全性通过模糊性来实现。如果URL被发现,它们将没有想要的WSDL。 - Allen Rice
我无法访问Web服务所在的服务器,因此我不确定他们是否能够设置仅限HTTPS的访问。您有其他推荐的方法吗? - zSynopsis
服务器端没有代码,基本身份验证是通过IIS设置的,您的主机将需要进行设置。这是很常见的,他们应该能够为您设置。要求https和使用基本身份验证都非常普遍(除了修改web.config),所以不要觉得您在请求什么特别的东西 :) - Allen Rice
@Allen:同意。虽然我们不能依赖于混淆来保证安全,但一旦我们已经确保了安全性,就没有理由不采取防御措施。通过加密连接和禁用WSDL,黑客的攻击变得更加困难,因为他们现在需要反向工程客户端。 - Steven Sudit
显示剩余2条评论

3

有三种常见的即席SOAP安全方法:

  1. 第一种方法是在每次调用时传递身份验证信息。
  2. 第二种方法是一次性传递身份验证信息以接收会话ID,然后在每次调用中传递该ID。
  3. 第三种方法与第二种方法基本相同,只是使用了cookie。

在这三种方法中,我推荐使用第一种方法,它不需要服务器维护状态,但由于缓存而可以同样快速。


通过会话ID,您是指基于令牌的安全性吗?这通常是我听到的称呼。此外,“第一种方法”可能会因其设置方式而大不相同且完全无效。例如,没有HTTPS的基本身份验证是毫无意义的,因为登录和密码是以明文形式发送的。 - Allen Rice
虽然可以简单地使用GUID,但重要的是它要足够大且具有有效的随机性,以防被猜测。您也不需要发送任何明文内容。例如,您可以调用GetChallenge来接收GUID,然后调用LoginWithResponse,将该GUID与明文帐户名和GUID、帐户和密码串联的哈希值一起传递。当然,您也可以使用HTTPS,从另一个方向解决这个问题。 - Steven Sudit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接