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

时间:2017-02-23 00:59:45

标签: android xamarin xamarin.android digest-authentication

我正在尝试使用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',Version:1.1,Content:System.Net.Http.StringContent,Headers: { 日期:2017年3月1日星期三05:56:11 GMT Set-Cookie:BIGipServerpool_MT_Q_HHComm_30483 = 1862543370.4983.0000; path = /,TS013bbd7d = 015e9dc2ca1e7a8720c0a49375a536c268624e8007810ada8f06b25d0a925a09448b0985b0b3ae98e8ac88b8217d3148626d7bd2ee;路径= /;安全;中HTTPOnly WWW-Authenticate:Digest qop =" auth&#34 ;, algorithm = MD5-sess,nonce =" + Upgraded + xxxxx",charset = utf-8,realm =" na01。 xxxxx.xxxx" X-Android-Received-Millis:1488347771526 X-Android-Response-Source:NETWORK 401 X-Android-Selected-Protocol:http / 1.1 X-Android-Sent-Millis:1488347764923 X-Powered-By:ASP.NET 内容类型:text / plain; charset = us-ascii,text / html 内容长度:1293 "

我甚至试过根据这篇文章提供自定义实现。仍然没有运气。 How can I enable NTLM and TLS 1.2 with Xamarin on Android?

1 个答案:

答案 0 :(得分:1)

您是否使用最新的Xamarin版本? Xamarin Cycle 9昨天下降,其中包括对TLS 1.2支持的更新。我想知道你是否因为没有为你的TLS实现使用Boring SSL而看到这些错误。有关配置的详细信息,请访问:

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

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

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

此外,您是否已通过浏览器在应用中运行的同一台设备上验证了网址和身份验证的效果?

您是否还可以提供诊断构建输出和错误跟踪,以便我们了解实际异常的更多信息?