如何使用需要重定向登录的WebApi WebService

时间:2016-02-02 08:28:35

标签: c# xml web-services asp.net-web-api

我们有一个桌面应用程序,需要通过服务器进行身份验证才能运行。此应用程序准备并向Web服务发送查询,从该Web服务提示用户登录,Web服务返回带有应用程序订阅信息的XML文档(软件即服务订阅许可证)。

我创建了一个WebApi Web服务,它执行以下操作:

  1. 接受来自/ api / client的传入请求?[MACHINEINFOINQUERYSTRING]
  2. 重定向到外部身份验证提供程序(想想GoogleId或 类似)
  3. 身份验证提供程序将信息发回 / API /订阅/ [AUTHENTICATIONID]
  4. / api / subscription端点在从服务器提取信息后返回XML文档(或包含相应的错误消息)。
  5. 此Web服务可以运行,并且可以在浏览器中查看XML文档。我创建了一个带有default.aspx的网站来测试它,自动重定向到/ api / client,它会在浏览器中显示这个XML文档。

    桌面应用程序正确进行初始调用,通过嵌入式浏览器重定向到登录页面,并接收XML,但无法解析此XML。应用程序团队只是获取XML的“下载”选项,但无法捕获填充到XmlDocument对象中的响应。我试图创建一个示例应用程序来指导应用程序团队,但没有成功。

    问题:

    • 我的架构是否存在根本错误,或者我们根本不知道如何正确使用响应?
    • 如何捕获和使用成功返回的XML?

    作为我尝试过的一个例子:

    string requestString = string.Format("http://[server]/api/client?{0}", HttpUtility.HtmlEncode(queryString));
    Response.Redirect(requestString);
    

    这在浏览器中工作,显示登录页面,允许输入,重定向到订阅端点,然后准备并将XML传送到浏览器。不幸的是,消费者无法使用它。

    HttpWebRequest request = WebRequest.Create(requestString) as HttpWebRequest;
    request.AllowAutoRedirect = true;
    request.MaximumAutomaticRedirections = 20;
    request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.None;
    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
    

    这不起作用。 response.ResponseUri具有OAuth服务的格式正确的地址(上面的步骤2)。它不会向用户显示登录页面,即使这是通过浏览器启动的。

    我也尝试过使用WebRequest POST,HttpClient PostAsync和其他几种方法,但是:

    响应URL只是登录页面的位置。如果我将3个WebRequest / WebResponse对串在一起,则会失败,因为在第一个请求/初始重定向时没有对用户进行适当的身份验证。

    我的default.aspx中有什么用处:

    我没有在网上找到一个满足我特定需求的示例,但由于大量网站都使用OAuth样式登录,因此该模式必须在实践中存在。我已经使用了也需要登录的webservices(比如OData端点),所以这个模式也必须存在于webservices中。我确实发回了格式正确的XML文档。我们只是不知道如何捕获和使用该文档。

    任何类似架构的例子都将受到高度赞赏!或者指出我正确的方向。

    编辑--- 我认为request.GetResponse()不是真的允许重定向和/或因为它是一个HttpWebRequest,所以它不允许用户输入。

    进行此调用并使用其他应用程序的XML的正确方法是什么? XML在浏览器窗口中正确传递(使用Response.Redirect),但不使用HttpWebRequest打开登录窗口。

1 个答案:

答案 0 :(得分:1)

答案是:这种架构从根本上说是错误的。

OAuth体系结构将授权留给客户端,然后客户端将授权令牌发送到它需要的所有后续服务。这些服务是简单的端点,不包含任何身份验证逻辑(尽管允许服务本身使用OAuth服务器验证身份验证令牌)。

此答案的正确事件顺序应为: 1)桌面应用程序向认证服务器发出OAuth认证请求。 2)成功的响应包括授权令牌,其包含身份信息,权限,有效期等。 3)桌面应用程序然后从WebApi服务请求信息,在请求中发送令牌。 4)WebApi接受此身份验证令牌,验证它(在我的情况下针对证书),甚至可以再次查询OAuth服务器以确保令牌仍然有效。 5)如果有效,Web服务将收集数据并将其发送回服务器。

我的问题是我期望订阅服务本身能够打开Web浏览器,提示登录,然后继续请求到另一个端点(初始请求后2个重定向)。我实际上打破了WebApi和OAuth 2设计。虽然它可以在浏览器中使用,但它不能从应用程序中使用。

重新设计这个更简单的模式后,我的网络服务现在可以使用了。