繁体   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