使用 Xamarin Android AndroidClientHandler 进行摘要式身份验证

Digest Authentication with Xamarin Android AndroidClientHandler

我正在尝试使用 Xamarin Android AndroidClientHandler 进行摘要式身份验证,但它 "Un Authorized - 401" (StatusCode: 401, ReasonPhrase: 'Unauthorized') 错误。这是我正在使用的代码。从 Xamarin 文档中我了解到 AndroidClientHandler 支持摘要式身份验证。在这里的任何帮助表示赞赏。

//Sample code in the Droid project
        var networkCredentials = new NetworkCredential("dummyuserId", "dummyPassword");
        var droidClientHandler = new AndroidClientHandler { Credentials = networkCredentials, AutomaticDecompression = DecompressionMethods.GZip, ClientCertificateOptions = ClientCertificateOption.Automatic };

        using (HttpClient oClient = new HttpClient(droidClientHandler))
        {
            //var iTimeout = 
            //oClient.Timeout = new TimeSpan(0, 0, 0, iTimeout);

            //Set Content Type
            oClient.DefaultRequestHeaders.Clear();

            // Setting the required header for the service. 
            oClient.DefaultRequestHeaders.Add(ApplicationConfigurationConstants.C_ACCOUNT_UNIT_HEADER, GetAccountingUnit());
            oClient.DefaultRequestHeaders.Add(ApplicationConfigurationConstants.C_AUTHENTICATION_TOKEN_HEADER, szAuthenticationToken);

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


            var oContent = new StringContent(szObject, Encoding.UTF8, "application/json");
            //Call Service
            var oResult = await oClient.PostAsync(url, oContent);
            //Get Result, if succeeds
            if (oResult != null && oResult.IsSuccessStatusCode)
            {
                var szResultContent = await oResult.Content.ReadAsStringAsync();
                return szResultContent;
            }
        }

我们已经通过 .net 客户端验证了此服务并且它有效。事实上,此服务与 Xamarin 中的默认 HttpClientHandler 一起工作。更改为 AndroidClientHandler

后,我们开始收到以下错误

"StatusCode: 401, ReasonPhrase: 'Unauthorized', 版本: 1.1, 内容: System.Net.Http.StringContent, Headers: { 日期:2017 年 3 月 1 日星期三 05:56:11 GMT Set-Cookie: BIGipServerpool_MT_Q_HHComm_30483=1862543370.4983.0000;路径=/,TS013bbd7d=015e9dc2ca1e7a8720c0a49375a536c268624e8007810ada8f06b25d0a925a09448b0985b0b3ae98e8ac88b8217d3148626d7bd2ee;路径=/;安全的;仅限HTTP WWW-Authenticate: 摘要 qop="auth",algorithm=MD5-sess,nonce="+Upgraded+xxxxx",charset=utf-8,realm="na01.xxxxx.xxxx" X-Android-Received-Millis: 1488347771526 X-Android-Response-Source:网络 401 X-Android-Selected-Protocol: http/1.1 X-Android-Sent-Millis:1488347764923 X-Powered-By: ASP.NET Content-Type: text/plain;字符集=us-ascii, text/html Content-Length: 1293 "

我什至尝试提供基于此 post 的自定义实现。仍然没有运气。 How can I enable NTLM and TLS 1.2 with Xamarin on Android?

您使用的是最新的 Xamarin 版本吗? Xamarin Cycle 9 昨天发布,其中包括对其 TLS 1.2 支持的更新。我想知道您是否会因为未将 Boring SSL 用于 TLS 实施而看到这些错误。可以在此处找到有关配置的详细信息:

https://developer.xamarin.com/releases/android/xamarin.android_7/xamarin.android_7.1/#TLS_1.2_support_in_WebRequest

对于您的项目,您需要将以下内容添加到您的项目中。

<PropertyGroup>
  <AndroidTlsProvider>btls</AndroidTlsProvider>
</PropertyGroup>

此外,您是否通过浏览器验证了 URL 并且身份验证在与应用程序 运行 相同的设备上有效?

您能否也提供诊断构建输出和错误跟踪,以便我们更多地了解实际异常是什么?