簡體   English   中英

首次成功進行REST調用后,不會驗證HttpClient上的憑據

[英]Credentials on HttpClient is not validated after first successful REST call

我正在創建一個用戶使用用戶名,密碼和域登錄的應用程序。 我希望盡可能多地在Windows平台上重復使用,因此我在可移植類庫中使用了nuget包Microsoft HTTP Client庫。

這是我如何使用HttpClientHandler創建HttpClient然后調用GetAsync。

    HttpClientHandler handler = new HttpClientHandler();
    ICredentials myCredentials = new NetworkCredential("Username", "Password", "Domain");
    handler.Credentials = myCredentials;

    HttpClient client = new HttpClient(handler);
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.BaseAddress = new Uri("https://....");
    HttpResponseMessage response = await client.GetAsync("...");

這似乎工作正常。 憑據在請求中發送,只允許注冊用戶獲取數據。

在我的應用程序中,用戶還可以選擇退出,然后再使用其他用戶名,密碼或域名登錄。 這就是問題所在。 如果我已經使用一些有效憑證調用了client.GetAsync,HttpClient似乎記住了舊的用戶憑據,盡管我每次都在創建一個新的HttpClient實例並為新用戶設置正確的憑據。

所以我的問題是,HttpClient是保持網絡通道打開還是有一些我不知道的會話問題?

---更新#1 ---

如果我在GetAsync(...)中使URL唯一,例如我可以隨請求傳遞一些隨機參數,服務器將驗證憑據,只有授權用戶才能訪問該資源。 這不是一個很好的解決方案,所以我做了更多的研究。

我看起來服務器正在發送一個名為Persistent-Auth:true的響應頭。 這告訴客戶端下一個請求不需要Authorization標頭。 我猜這就是為什么在下一次我沒有發送憑據的情況下我嘗試為相同的資源調用GetAsync。 令人驚訝的是,我在Fiddler中也注意到,對於此資源的第二個請求,客戶端根本沒有發送任何HTTP請求。

一個有趣的事情是,如果我在瀏覽器中嘗試相同的方法,授權具有相同的行為,因此它僅包含在第一個請求中。 對於對同一資源的第二個請求,我可以在Fiddler中看到正在按預期發送HTTP請求。

總而言之。 我想我遇到了2個問題。 首先,是否可以更改此Persistent-Auth行為,以便在服務器響應中將其設置為false。 第二,為什么我的應用程序在第二次請求相同資源時根本不發送任何請求。

根據這個問題的答案: 如何在Windows.Web.Http.HttpClient上停止憑據緩存?

它應該適用於Windows build 10586以上版本。 要手動清除所有緩存的憑據,我們還可以調用方法HttpBaseProtocolFilter.ClearAuthenticationCache()來清除所有緩存的憑據信息。 可以在此處找到此方法的文檔: https//docs.microsoft.com/en-us/uwp/api/Windows.Web.Http.Filters.HttpBaseProtocolFilter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM