【问题标题】:ASP.NET web service using forms authentication from a windows app使用来自 Windows 应用程序的表单身份验证的 ASP.NET Web 服务
【发布时间】:2010-04-03 16:08:16
【问题描述】:

我有一个可以通过 Windows 程序访问的 ASP.NET Web 服务,但现在我想保护该 Web 服务。我可以使用表单身份验证来保护 Web 服务。如何从 Windows 窗体应用程序访问受保护的 Web 服务?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    虽然这不是正确的方法,但理论上可以按照您描述的方式使用表单身份验证。这可以通过以下任一方式完成:

    1. 使用 WebRequest 将您的请求以原始形式发送到 Web 服务。这将涉及检查响应,提取相关的表单身份验证字段,并发送回让用户登录的响应。这将生成一个 cookie,您必须将其与对服务的每个后续响应一起发送
    2. 自己生成 FormsAuthentication 身份验证 cookie。这很复杂,因为它涉及在调用应用程序上同步机器密钥,并人为地操纵发送到托管服务的机器的标头。
    3. 在需要与 Web 服务交互的会话开始时显示表单身份验证表单供用户登录。然后,您可以收获生成的 cookie 并将其呈现给 HTTP 标头中的服务,如选项 (2) 所示。

    如您所见,这些方法非常复杂,并且从根本上说是在从未打算使用表单身份验证的情况下使用的黑客攻击。

    Microsoft 打算让我们使用 Windows 身份验证或 SSL 证书来保护对 ASP.NET Web 服务的访问。请参阅 MSDN 上的 HTTP Security and ASP.NET Web Services

    如果您能够使用 WCF,那么会出现更多选项,包括在 SOAP 中构建自定义身份验证机制的能力,以及 WCF 的一些支持。

    在大多数情况下,保护 Web 服务是这项工作中最棘手的部分之一。我见过的许多现场解决方案都是上述的妥协方案。

    【讨论】:

      【解决方案2】:

      似乎答案是否定的。 Forms 身份验证是一种基于 cookie 的机制,您的 WinForms 应用程序将无法保存和中继 cookie(如果有的话,没有一些严肃的解决方法)。

      我在研究您的问题时写的一个潜在的解决方法是尝试使用 NetworkCredential 对象,但这不起作用。还尝试了 .NET 4.0 中的 ClientCredentials

      var ss = new MySecureWebService.MyServiceSoapClient();
      ss.ClientCredentials.UserName.UserName = "abc";
      ss.ClientCredentials.UserName.Password = "123";
      string asmxReturn = ss.HelloWorld(); //exception returned here
      

      调用 web 方法时,控制台应用仍然显示登录 html 页面。

      其他建议

      • 如果您有 Web 服务的源代码,请将其逻辑提取到它自己的程序集中。在您的 WinForms 应用程序中引用该程序集,就好像您正在调用 Web 服务一样。

      我了解您的目标是重用已部署的应用,但最好的办法是通过 .dll 引用使用相同的逻辑/实现。

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 堆栈溢出帖子应该包含比链接更多的内容。例如,解释为什么您提供的链接应该有所帮助或将相关信息复制到堆栈溢出。
        猜你喜欢
        • 1970-01-01
        • 2010-11-10
        • 2012-07-27
        • 2014-01-26
        • 2013-02-19
        • 2011-02-04
        • 2016-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多