我們有一個桌面應用程序需要與服務器進行身份驗證才能操作。此應用程序準備並向Web服務發送查詢,從該Web服務提示用戶登錄,Web服務返回帶有應用程序訂閱信息的XML文檔(軟件即服務訂購許可證)。如何使用需要重定向登錄的WebApi WebService
我創建了一個Web服務的WebAPI是執行以下操作:?
- 接受在/ API /客戶端傳入的請求[MACHINEINFOINQUERYSTRING]
- 重定向到外部驗證提供者(認爲GoogleId或 類似)
- 身份驗證提供程序將信息發送回 /api/subscription/[AUTHENTICATIONID]
- /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打開登錄窗口。
XML Serializer Class在哪裏?你甚至執行過它嗎? – Aizen
對不起,沒想到它是相關的:Global.ascx.cx註冊了XmlFormatter。 「訂閱」類將成功序列化爲正確的可分析XML。 「客戶端」類不會序列化(它可以,但我使用公共IHttpActionResult GetClient()接口返回OK或在這種情況下重定向。如果傳入數據不好,它返回一個OK與一個正確格式的客戶端XML對象,包括錯誤信息,我也試過返回一個RedirectResult,但是'不會觸發WebRequest的重定向' – Greg
你能在你的問題中添加響應值嗎? – Aizen