将当前身份验证凭据从UWP应用程序传递到Web服务,以使用这些凭据访问服务器上的资源

时间:2018-03-21 21:48:59

标签: c# xaml uwp windows-authentication wcf-web-api

我的Windows 10 UWP应用程序正在调用我创建的WebAPI Web服务。我需要在调用Web服务时在客户端传递当前凭据,以便它可以使用这些凭据访问其他资源。

我还需要在不提示用户提供凭据的情况下执行此操作,以便体验无缝。

我可以使用System.Net.Http执行此操作,并成功将当前凭据传递给服务器以用于访问资源。这会发送请求并在没有任何提示的情况下带回响应。我已在UWP应用上启用了Enterprise AuthenticationPrivate Networks功能,以使其发挥作用。

问题:这适用于GET请求,但不适用于同一服务器的POST请求。 POST请求会导致以下错误:

  

此IRandomAccessStream不支持GetInputStreamAt方法   因为它需要克隆,而且这个流不支持克隆。

我读到这是此链接上的错误:PostAsync throwing IRandomAccessStream error when targeting windows 10 UWP。针对此错误在多个位置提出的解决方法是使用Windows.Web.Http代替。但是,如果我这样做,我如何将默认/当前凭据传递给服务器?

以下是我用来使用当前Windows凭据执行GET请求而不提示它的代码。它完美无缺:

System.Net.Http.HttpClientHandler handler = new System.Net.Http.HttpClientHandler
{
    UseDefaultCredentials = true
    // Credentials = (NetworkCredential)System.Net.CredentialCache.DefaultNetworkCredentials
    //using either one of the above enables me to have the web service use the current credentials without prompting
};

string responseContent = string.Empty;

using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(handler))
{
    System.Net.Http.HttpRequestMessage requestMessage = new System.Net.Http.HttpRequestMessage();

    requestMessage = new System.Net.Http.HttpRequestMessage
    {
        Method = System.Net.Http.HttpMethod.Get,
        RequestUri = new Uri(strWebServiceURL)

    };

    using (System.Net.Http.HttpResponseMessage response = await client.SendAsync(requestMessage))
    {

        responseContent = await response.Content.ReadAsStringAsync();

    }

    //This also works fine
    using (System.Net.Http.HttpResponseMessage response = await client.GetAsync(strWebServiceURL))
    {

        responseContent = await response.Content.ReadAsStringAsync();

    }

以下是我用来执行POST请求的代码,导致IRandomAccessStream错误:

System.Net.Http.HttpClientHandler handler = new System.Net.Http.HttpClientHandler
{
    UseDefaultCredentials = true
   // Credentials = (NetworkCredential)System.Net.CredentialCache.DefaultNetworkCredentials
   //using either one of the above enables me to have the web service use the current credentials without prompting
};

string responseContent = string.Empty;

using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(handler))
{
    System.Net.Http.HttpRequestMessage requestMessage = new System.Net.Http.HttpRequestMessage();

    requestMessage = new System.Net.Http.HttpRequestMessage
    {
        Content = myMultipartFormDataContent,
        Method = System.Net.Http.HttpMethod.Post,
        RequestUri = new Uri(strWebServiceURL)

    };

    using (System.Net.Http.HttpResponseMessage response = await client.SendAsync(requestMessage))
    {

        responseContent = await response.Content.ReadAsStringAsync();

    }

    //No difference when using it this way as well
    using (System.Net.Http.HttpResponseMessage response = await client.PostAsync(strWebServiceURL, myMultipartFormDataContent))
    {

        responseContent = await response.Content.ReadAsStringAsync();

    } 

我尝试使用Windows.Web.Http,但我不知道如何在没有提示的情况下将当前/默认凭据传递给服务器。

我还将WebService URL添加到IE本地Intranet区域,并将该区域设置为使用当前用户名和密码自动登录:

请帮忙!

IE Settings

1 个答案:

答案 0 :(得分:1)

在UWP应用中使用新的bool命名空间,如果您想使用Windows.Web.Http,您只需打开清单中的企业凭据,uwp应用就会将其发送为适当。您无需在DefaultCredentials上配置任何内容即可使其正常运行。详情请参阅here

由于您已经启用了企业凭据功能,因此您可以在不配置的情况下创建HttpClient。但是为了避免用户名和密码提示,您可能需要禁用UI,例如:

HttpClient