【问题标题】:Xamarin iOS ModernHttpClient Owin OAuth2 Bearer Token Authentication DefaultHeader causes "System.Net.WebException: cannot parse response"Xamarin iOS ModernHttpClient Owin OAuth2 Bearer Token Authentication DefaultHeader 导致“System.Net.WebException:无法解析响应”
【发布时间】:2016-05-25 16:02:00
【问题描述】:

我正在创建 Xamarin Forms 概念证明,但在发布到我的休息服务时遇到了一些问题。 REST 服务是使用 OAuth Bearer Tokens 的 Web API 2 Rest 服务。我通过 https 使用有效的 SSL 证书运行它。

我可以在设备上很好地获取令牌,但是,使用 Bearer 令牌授权标头发布会导致

System.Net.WebException:无法解析响应。

如果我省略了授权标头,由于身份验证,请求在服务器上失败。如果我包含它,则请求永远不会发送到服务器(使用 charles 代理进行验证)。

“rest 客户端”是一个简单的 HttpClient 包装器,以 ModernHttpClient 作为提供者,在 PCL 中定义。 “rest 客户端”在控制台应用程序中运行良好。我想我在 iOS 中看到了与身份验证标头相关的较低级别的异常...

这就是我在 PCL 中构建 HttpClient 的方式:

        Client = new HttpClient(new NativeMessageHandler());
        Client.MaxResponseContentBufferSize = 256000;
        Client.BaseAddress = new Uri("https://rest-dev.mysub.mydomain.com");

        Client.DefaultRequestHeaders.Accept.Clear();
        Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Authentication.AuthorizationToken); // Authentication is where I store the token

然后我发布模型:

        var strContent = JsonConvert.SerializeObject(model);
        var content = new StringContent(strContent, Encoding.UTF8, "application/json");
        HttpResponseMessage response = await client.PostAsync($"api/devices", content);

所有这些都包含在使用相同 PCL 发布到服务器的测试应用程序中。

不确定这是否重要,但如果确实如此,在 Xamarin Forms PCL 中,这将在登录时的新命令中调用(在获取令牌之后)。

无论是在 iOS 模拟器还是在我的设备上运行,我都会遇到同样的错误。

我发现有趣的是,当我不使用 ModernHttpClient 作为提供程序时,我在尝试获取令牌时收到不同的错误:

“System.Net.WebException:错误:SendFailure(写入标头错误)”

对此的研究引导我走上了设置有效 SSL 的道路。

我们将不胜感激任何正确方向的帮助。我的 google-fu 在墙上。

更新

我想我正在解决这个问题,它与 SSL 证书有关。我使用了 Charles Proxy 并让它安装了它的证书来调试连接,它才开始工作。但是,如果不使用 Charles Proxy,仍然无法工作。

【问题讨论】:

    标签: ios rest xamarin xamarin.ios xamarin.forms


    【解决方案1】:

    这原来是 IIS SSL 握手的问题。我的解决方案:

    https://serverfault.com/a/779895/42134

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,因为我的网络服务器设置为仅使用 TLS1.2。添加后 SSL 握手工作:

              System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
      

      到 Startup.Auth.cs -> WebAPI 中的 ConfigureAuth 方法以及客户端代码的初始化中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-06
        • 2017-12-07
        • 2015-12-25
        • 1970-01-01
        • 2018-01-18
        • 2020-05-10
        • 2018-06-14
        • 2014-09-24
        相关资源
        最近更新 更多