【问题标题】:Universal App NTLM working for Windows Store, but not Windows Phone通用应用 NTLM 适用于 Windows 应用商店,但不适用于 Windows Phone
【发布时间】: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


【解决方案1】:

它远未完成,但你可以试试这个: http://uwapi.codeplex.com/

但是...据我所知,Windows Phone 模拟器不允许 https 连接到本地主机。也许那是你的问题。您需要添加证书以允许 https 流量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多