2016-02-02 25 views
0

我們有一個桌面應用程序需要與服務器進行身份驗證才能操作。此應用程序準備並向Web服務發送查詢,從該Web服務提示用戶登錄,Web服務返回帶有應用程序訂閱信息的XML文檔(軟件即服務訂購許可證)。如何使用需要重定向登錄的WebApi WebService

我創建了一個Web服務的WebAPI是執行以下操作:?

  1. 接受在/ API /客戶端傳入的請求[MACHINEINFOINQUERYSTRING]
  2. 重定向到外部驗證提供者(認爲GoogleId或 類似)
  3. 身份驗證提供程序將信息發送回 /api/subscription/[AUTHENTICATIONID]
  4. /api/subscription端點從服務器提取信息後返回XML文檔(o包括適當的錯誤信息)。

此WebService工程和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等幾種方法,但嘗試:

響應網址就是登錄頁的位置。如果我將3個WebRequest/WebResponse對串起在一起,它會失敗,因爲用戶在第一次請求/初始重定向時未被正確驗證。

什麼在我的默認工作。aspx:

我還沒有找到適合我的具體需求的示例,但該模式必須在實踐中存在,因爲大量網站使用OAuth樣式登錄。我利用了也需要登錄的webservices(如OData端點),所以這種模式也必須存在於web服務中。我確實發回了格式正確的XML文檔。我們只是不知道如何捕獲和使用該文檔。

任何類似架構的例子將不勝感激!或者把我指向正確的方向。

編輯--- 我在想,request.GetResponse()不是真的允許重定向和/或因爲它是一個HttpWebRequest,它沒有辦法允許用戶輸入。

從另一個應用程序進行此調用並使用XML的正確方法是什麼? XML在瀏覽器窗口中正確傳遞(使用Response.Redirect),但沒有使用HttpWebRequest打開登錄窗口。

+0

XML Serializer Class在哪裏?你甚至執行過它嗎? – Aizen

+0

對不起,沒想到它是相關的:Global.ascx.cx註冊了XmlFormatter。 「訂閱」類將成功序列化爲正確的可分析XML。 「客戶端」類不會序列化(它可以,但我使用公共IHttpActionResult GetClient()接口返回OK或在這種情況下重定向。如果傳入數據不好,它返回一個OK與一個正確格式的客戶端XML對象,包括錯誤信息,我也試過返回一個RedirectResult,但是'不會觸發WebRequest的重定向' – Greg

+0

你能在你的問題中添加響應值嗎? – Aizen

回答

0

答案是:這種架構根本上是錯誤的。

OAuth體系結構將授權留給客戶端,客戶端然後將授權令牌發送給它需要的所有後續服務。服務是簡單的端點,並且不包含任何驗證邏輯(儘管服務本身可以使用OAuth服務器驗證身份驗證令牌)。

該答案的正確順序應爲: 1)桌面應用程序向認證服務器發出OAuth認證請求。 2)成功的響應包括授權令牌,其中包含身份信息,權限,有效期等。 3)桌面應用程序然後向WebApi服務請求信息,發送請求中的令牌。 4)WebApi使用此身份驗證令牌,對其進行驗證(針對證書),甚至可能再次查詢OAuth服務器以確保令牌仍然有效。 5)如果有效,Web服務收集數據並將其發送回服務器。

我的問題是我期待的訂閱服務本身能夠打開Web瀏覽器,提示登錄,然後繼續請求到另一個端點(初始請求後有2個重定向)。實際上,我打破了WebApi和OAuth 2設計。雖然它在瀏覽器中工作,但它不是應用程序可以使用的。

重新設計到這個更簡單的模式後,我的Web服務現在是可用的。

相關問題