使用Windows.Web.Http.HttpClient

时间:2018-04-02 16:16:39

标签: rest asp.net-web-api uwp httpclient windows-authentication

我知道这个问题一再被问到herehere。给出的答案几乎是一样的,但在我的情况下,我仍然会遗漏一些东西,我无法确切地知道它是什么。我部署了RESTful Web API,并且配置为仅接受域验证的调用。所以在我的客户端,在我的UWP应用程序中,我使用了Windows.Web.Http命名空间中的HttpClient类。在线发现的资源都表明我需要做两件事:

  1. 在我的UWP应用的包清单中启用企业身份验证。我做到了以下是为我的应用选择的功能的屏幕截图:
  2. enter image description here

    1. 将“AllowUI”标志设置为false,以便不提示用户输入其凭据。我也这样做了。这是我正在做的代码片段:

      Uri uri = new Uri(_myUriRoute);

      var filter = new HttpBaseProtocolFilter {AllowUI = false}; var httpClient = new HttpClient(filter);

      HttpResponseMessage response = await httpClient.GetAsync(uri);

    2. 使用此代码,我不会收到提示输入凭据,但是response.IsSuccessStatusCode标志返回false,我得到的错误是401 - 未经授权。

      在您提出之前,是的,服务器端端点已正确配置并正常工作。如果我试试这个:

      Uri uri = new Uri(_myUriRoute);
      
      var filter = new HttpBaseProtocolFilter();
      var httpClient = new HttpClient(filter);
      
      HttpResponseMessage response = await httpClient.GetAsync(uri);
      

      我被要求提供我的凭据,当我正确输入时,我得到了正确的HTTP 200代码作为回应。我也试过这个:

      Uri uri = new Uri(_myUriRoute);
      
      var filter = new HttpBaseProtocolFilter
      {
         AllowUI = false,
         ServerCredential = new PasswordCredential(_myUriRoute, _myUserName, _myPassword)
      };
      var httpClient = new HttpClient(filter);
      
      HttpResponseMessage response = await httpClient.GetAsync(uri);
      

      再一次,我得到了一个不错的HTTP 200。

      那我错过了什么?我不想被提示,我也不想存储凭据。我想让Windows自动传递应用程序当前用户的凭据。

      值得一提的两件事。当我尝试使用“本地计算机”选项调试/运行我的应用程序时,上述行为发生在我的开发环境(Visual Studio 2017)中。此外,当我启动应用程序时发生的第一件事是我被提示授予应用程序访问图片文件夹和帐户信息的权限:

      enter image description here

      尽管我已经在应用程序设置的功能中选择了“用户帐户信息”,但在应用程序包清单中的“功能”选项卡的上面的屏幕截图中可以看到这种情况。

      知道缺少什么吗?还有什么想法应该尝试吗?

      任何建议都将受到高度赞赏。

      干杯,

      埃迪

      PS:我也在MSDN论坛上发布了same question

      PS2:Web API在IIS Express中运行,从Visual Studio 2017开始,在另一个实例中运行。我将IIS Express配置为使用我的开发机器的IP地址而不是“localhost”来公开我的Web API。在其web.config文件中,我有以下设置:

      <system.web>
         <authentication mode="Windows"/>
      </system.web>   
      

      我发布这个,以防万一问题出在服务器端,我认为不是。

0 个答案:

没有答案