首次成功进行REST调用后,不会验证HttpClient上的凭据

时间:2013-10-15 08:46:29

标签: c# .net-4.5 windows-authentication portable-class-library dotnet-httpclient

我正在创建一个用户使用用户名,密码和域登录的应用程序。我希望尽可能多地在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(...)中使网址唯一,例如我可以通过请求传递一些随机参数,服务器将验证凭据,只有授权用户才能访问该资源。这不是一个好的解决方案,所以我做了更多的研究。

我看起来服务器正在发送名为Persistent-Auth:true的响应头。这告诉客户端下一个请求不需要Authorization标头。我猜这就是为什么在下一次我没有发送凭据的情况下我尝试为相同的资源调用GetAsync。令人惊讶的是,我在Fiddler中也注意到,对于此资源的第二个请求,客户端根本没有发送任何HTTP请求。

有趣的是,如果我在浏览器中尝试相同的方法,则授权具有相同的行为,因此它仅包含在第一个请求中。对于对同一资源的第二个请求,我可以在Fiddler中看到正在按预期发送HTTP请求。

总而言之。我想我遇到了2个问题。首先,是否可以更改此Persistent-Auth行为,以便在服务器响应中将其设置为false。其次,为什么我的应用程序在第二次请求相同资源时根本没有发送任何请求。

1 个答案:

答案 0 :(得分:1)

根据这个问题的答案: How to stop credential caching on Windows.Web.Http.HttpClient?

它应该适用于Windows build 10586及更高版本。 要手动清除所有缓存的凭据,我们还可以调用方法 HttpBaseProtocolFilter.ClearAuthenticationCache(),该方法将清除所有缓存的凭据信息。可以在以下位置找到此方法的文档:https://docs.microsoft.com/en-us/uwp/api/Windows.Web.Http.Filters.HttpBaseProtocolFilter