首次成功 REST 调用后,不会验证 HttpClient 上的凭据
本文关键字:HttpClient 验证 成功 REST 调用 | 更新日期: 2023-09-27 18:35:28
我正在创建一个应用程序,用户在其中使用用户名,密码和域登录。我想尽可能多地跨 Windows 平台重用,所以我在可移植类库中使用 nuget 包Microsoft HTTP 客户端库。
以下是我如何使用 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("...");
这似乎工作正常。凭据在请求中发送,并且仅允许注册用户获取数据。
在我的应用程序中,用户还可以选择注销,然后使用其他用户名、密码或域再次登录。这就是问题所在。如果我打电话给客户。GetAsync 使用一些有效的凭据一次,HttpClient 似乎会记住旧用户凭据,尽管我每次都会创建一个新的 HttpClient 实例并为新用户设置正确的凭据。
所以我的问题是,HttpClient 是否保持网络通道打开,或者是否存在一些我不知道的会话问题?
---更新 #1 ---
如果我在 GetAsync(...) 中使 URL 唯一,例如我可以在请求中传递一些随机参数,服务器将验证凭据,只有授权用户才能访问资源。这不是一个好的解决方案,所以我做了更多的研究。
我看起来服务器正在发送一个名为持久身份验证的响应标头:true。这会告知客户端下一个请求不需要授权标头。这就是为什么下次我尝试为同一资源调用 GetAsync 时不发送凭据的原因。令人惊讶的是,我还在 Fiddler 中注意到,对于对该资源的第二个请求,根本没有从客户端发送 HTTP 请求。
有趣的是,如果我在浏览器中尝试相同的方法,授权具有相同的行为,因此它仅包含在第一个请求中。对于对同一资源的第二个请求,我可以在 Fiddler 中看到 HTTP 请求正在按您的预期发送。
所以总结一下。我想我被困在 2 个问题上。首先,是否可以更改此持久身份验证行为,以便在服务器响应中将其设置为 false。其次,为什么我的应用程序在第二次请求相同的资源时根本不发送任何请求。
根据这个问题的答案:如何在Windows.Web.Http.HttpClient上停止凭据缓存?
它应该适用于Windows内部版本10586及更高版本。要手动清除所有缓存的凭据,我们还可以调用方法 HttpBaseProtocolFilter.ClearAuthenticationCache() 来清除所有缓存的凭据信息。可以在此处找到此方法的文档:https://learn.microsoft.com/en-us/uwp/api/Windows.Web.Http.Filters.HttpBaseProtocolFilter