【问题标题】:asmx web service: client authenticationasmx Web 服务:客户端身份验证
【发布时间】:2009-07-07 13:40:17
【问题描述】:

我有一个 Web 服务,其中包含一些我想在一定程度上确保安全的方法。 这些数据并不是真的那么机密,但我仍然希望只允许那些使用存储在 web 服务 web.config 文件中的特定用户 ID 和密码的人访问。 C# Windows 服务客户端将每天或每周调用一次此 Web 服务。

谁能发布一个简单的例子来说明我如何做到这一点?提前致谢。

【问题讨论】:

    标签: c# .net web-services authentication asmx


    【解决方案1】:

    这与我的问题非常相似:"What should we implement to authorize clients to use our web service?"

    我们最终没有发布 WSDL,只通过 https 提供服务并要求 basic authentication。如果您不能强制所有客户端使用 https,请不要使用基本身份验证。

    如果这是一个 .net 网络服务,那么这里是防止 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并使用基本身份验证是合理的。
    • 当然,不发布 WSDL 是通过默默无闻的安全性。但是,https + 基本身份验证 + Web 服务代码本身内置的一些安全性并不是通过默默无闻的安全性。如果 URL 被发现,他们将没有所需的 WSDL。
    • 我无权访问 Web 服务所在的服务器,因此我不确定他们是否能够设置仅 https 访问。有没有其他方法可以推荐?
    • 如果您不在乎,请跳过 https,只使用基本身份验证 耸耸肩。如果你有点认真,请他们要求 https。您必须为证书付费,他们必须安装它。您拥有的任何托管服务提供商都应该只需要 https,它的操作非常简单,只需一个复选框
    • 好吧,我想我会问他们。另一个问题。您是否碰巧有一些关于 Web 服务端身份验证的示例代码?
    【解决方案2】:

    ad hoc SOAP 安全性有三种通用方法:

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

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

    【讨论】:

    • 按会话 ID,您指的是基于令牌的安全性吗?这就是我通常听到的所谓的。此外,根据他的设置方式,“第一种方法”可能会有很大不同并且完全无效。 IE。没有 HTTPS 的基本身份验证,因为登录名和密码以纯文本形式发送,所以毫无价值。
    • 有点,虽然它可以像 GUID 一样简单。重要的是它很大并且有效地随机,所以它不能被猜测。您也不需要以纯文本形式发送任何内容。例如,您可以调用 GetChallenge 来接收 GUID,然后调用 LoginWithResponse,传入该 GUID,以及明文帐户名称以及 GUID、帐户和密码串联的哈希值。或者,当然,你可以使用 HTTPS,它从另一个方向解决它。
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 2016-11-03
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多