C# 通用应用程序NTLM适用于Windows应用商店,但不适用于Windows Phone

C# 通用应用程序NTLM适用于Windows应用商店,但不适用于Windows Phone,c#,windows-phone-8,ntlm,win-universal-app,C#,Windows Phone 8,Ntlm,Win Universal App,我正在构建一个通用应用程序,可以访问web API获取数据 当我在Windows应用商店应用程序中运行身份验证时,一切正常,我的登录调用得到200个响应,下面的代码中是对_url2的HTTP POST调用 当我从Windows Phone emulator运行完全相同的代码时,我得到一个401未经授权的密码 以下是我用来访问服务的代码: var handler = new HttpClientHandler { AllowAutoRedirect = true, PreAuthe

我正在构建一个通用应用程序,可以访问web API获取数据

当我在Windows应用商店应用程序中运行身份验证时,一切正常,我的登录调用得到200个响应,下面的代码中是对_url2的HTTP POST调用

当我从Windows Phone emulator运行完全相同的代码时,我得到一个401未经授权的密码

以下是我用来访问服务的代码:

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 emulator不允许https连接到本地主机。也许这就是你的问题。您需要添加一个证书以允许https通信

那么,您已经在模拟器中测试过了,但是您在windows phone设备上测试过代码了吗?我没有。我实际上没有解锁的设备:/app连接的服务器是否运行IIS?因此,根据该链接,预认证可能导致该错误。您可以尝试将PreAuthenticate设置为false,看看这是否也有帮助。它正在IIS上运行。我回家后会检查一下,看看这是否改变了什么:你找到解决办法了吗?我也有同样的问题。。。