将CredentialCache对象分配给Windows Universal Apps中的HttpWebRequest.Credentials无法正常工作

时间:2016-04-27 11:59:00

标签: c# authentication httpwebrequest win-universal-app credentials

我正在使用Visual Studio 2015,Framework 4.5.2创建Windows Universal App。目标版本10586,最低版本10240.

我的应用需要使用凭据对https页面进行身份验证。我已经阅读了很多这样的例子:

WebRequest req =     HttpWebRequest.Create("https://intranet.anyweb.com");
NetworkCredential ntCred = new NetworkCredential(user, pass);
req.Credentials = ntCred;
CredentialCache cacheCred = new CredentialCache();
cacheCred.Add(new Uri("https://intranet.anyweb.com"), "NTLM", ntCred);
req.Credentials = cacheCred;
req.Method = "GET";
var resp = (HttpWebResponse)req.GetResponseAsync();

此示例在桌面应用程序中运行良好,但当我尝试在我的通用APP中生成相同内容并执行GetResponseAsync时,抛出此错误:

"价值' System.Net.CredentialCache'属性'凭据'。"

不支持

标准桌面Windows应用程序中的相同代码工作正常,为什么我不能在我的通用应用程序中将CredentialCache对象分配给HttpWebRequest凭据?

1 个答案:

答案 0 :(得分:1)

我建议您阅读以下Microsot博客post,在那里您将了解到System.Net.Http.HttpClient和Windows.Web.Http.HttpClient是推荐的API,适用于较旧的不受欢迎的API,例如作为WebClient和HttpWebRequest。

使用以下代码,您应该能够使用用户凭据:

HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
filter.ServerCredential = new PasswordCredential( uri, username, password);
HttpClient httpClient = new HttpClient(filter);

HttpRequestMessage request = new HttpRequestMessage();
request.Method = HttpMethod.Get;
request.RequestUri = new Uri(uri, UriKind.Absolute);

HttpResponseMessage response = await httpClient.SendRequestAsync(request);

如果服务器请求NTLM身份验证,则操作系统的HTTP堆栈将使用这些凭据执行身份验证。对于具有企业功能的应用程序,如果在ServerCredential属性上未设置凭据,则将使用该用户的Windows登录凭据。对于其他应用程序,默认情况下会弹出UI询问用户凭据