【发布时间】:2014-08-18 02:03:27
【问题描述】:
我正在构建一个通用应用程序,它可以访问数据的 Web API。
当我在 Windows 应用商店应用程序中运行身份验证时,一切正常,我在登录调用时收到 200 响应(在下面的代码中,HTTP POST 调用 _url2)
当我从 Windows Phone 模拟器运行完全相同的代码时,我得到 401 Unauthorized。
这是我用来访问服务的代码:
var handler = new HttpClientHandler
{
AllowAutoRedirect = true,
PreAuthenticate = true,
CookieContainer = _cookies,
Credentials = new NetworkCredential(username, password),
UseCookies = true,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
using (var client = new HttpClient(handler, true))
{
//client.DefaultRequestHeaders.Connection.Add("keep-alive");
// Having the Connection = keep-alive causes the phone to throw an exception... not needed, but annoying
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("*/*"));
var res = await client.GetAsync(_url1); // This works and will negotiate NTLM on both platforms. Returns 200 on both Phone and Store apps
client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
client.DefaultRequestHeaders.Referrer = new Uri(_url1);
client.DefaultRequestHeaders.Add("Origin", _url1);
using (var message = new HttpRequestMessage(HttpMethod.Head, _url2))
{
var header = await client.SendAsync(message); // 401 on Phone, 200 on Store app
}
var resp = await client.PostAsync(_url2, new StringContent(LoginContent)); // 401 on Phone, 200 on Store app
using (var stream = await resp.Content.ReadAsStreamAsync())
using (var reader = new StreamReader(stream))
{
var html = await reader.ReadToEndAsync();
ParseLoginResults(html);
}
}
我认为当客户端执行Get 以外的操作时,它似乎没有完成 NTLM 握手...我无法配置 Fiddler 以与我的模拟器一起使用,所以我没有得到很好地追踪正在发生的事情。通信都是通过 HTTPS 进行的,所以我也无法通过 WireShark 获得任何有用的信息。
知道为什么它可以在 Windows 应用商店应用上运行,但不能在手机上运行吗? NTLM 身份验证还有其他解决方法吗?我可以手动完成所有操作吗?
【问题讨论】:
-
那么,你已经在模拟器中测试过了,但是你在windows phone设备上测试过代码吗?
-
我没有。我实际上没有开发者解锁设备:/
-
应用程序连接的服务器是否正在运行 IIS? support.microsoft.com/kb/2749007 所以-根据该链接,预认证是可能导致该错误的原因。您可以尝试将 PreAuthenticate 设置为 false,看看是否也有帮助。
-
它在 IIS 上运行。我回家后会检查一下,看看是否有任何改变:)
-
您找到解决方案了吗?我也有同样的问题...
标签: c# windows-phone-8 ntlm win-universal-app