【发布时间】:2016-10-31 08:30:56
【问题描述】:
这里是我的问题的背景:我正在开发一个 Windows 应用商店应用程序,该应用程序将被侧载到我们的客户计划使用的几台平板电脑上。此平板电脑应用程序将调用 Web API,该 API 反过来将使用存储库(通过 EntityFramework 的 SQL Server)执行 CRUD 操作。一切都必须使用 Windows 身份验证。这些平板电脑是运行 Windows 10 的戴尔。每个用户都将使用自己的活动域凭据登录。平板电脑会将凭据传递给 Web API,而 Web API 又会将它们传递给存储库(数据库)。根据凭据,存储库将确定用户所属的组,并据此授予用户有权访问的资源的访问权限。
我的 Web API 工作正常。我用 Fiddler 对其进行了测试。对于我想测试的 HTTP GET 请求,我选中了“自动验证”复选框,我可以看到三个连续的消息,前两个返回 401,第三个返回 HTTP 代码 200,以及我请求的数据。
但是,当我尝试从我的 Windows 应用商店应用程序调用它时,我只发送一个 GET 请求,即第一个。我的 Web API 托管在 IIS Express 中。根据该小组中一位非常独特的成员的建议,我将 IIS Express 配置为使用我的开发机器的 IP 地址而不是“localhost”公开 Web API。在此之前,我不会看到任何 GET 请求到达服务器,甚至是第一个。
我知道 Windows 身份验证使用 NTLM 方案,它需要一个协商过程,因此 Fiddler 最初向服务器发送 3 条消息?
我需要如何编写我的 Web API 客户端代码来绕过此协商?我花了整个上午和下午在 SO 和许多其他网站上阅读我的问题的解决方案,但不知何故,我仍然没有让它工作。我一定错过了什么,我不知道是什么。这是我在 Web API 客户端的代码:
var authHandler = new HttpClientHandler()
{
Credentials = CredentialCache.DefaultNetworkCredentials,
ClientCertificateOptions = ClientCertificateOption.Automatic
};
var webApiClient = new HttpClient(authHandler)
{
BaseAddress = new Uri(_serviceUri), // _serviceUri is a string that looks like this "http://10.120.5.201:53045"
};
webApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await webApiClient.GetAsync("api/user");
我的调用永远不会从 GetAsync 返回,但在 Fiddler 中,我只能看到第一个 GET 请求被发布到服务器。我怎样才能让我的客户在幕后跟进,就像 Fiddler 所做的那样,并发送另外两条消息,以便最终第三条消息返回响应 HTTP 200 代码和我在 Fiddler 中收到的数据?
如果有人能指出我正确的方向,我将不胜感激。
【问题讨论】:
标签: asp.net-web-api windows-authentication iis-express dotnet-httpclient windows-store