使用 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 实施而看到这些错误。可以在此处找到有关配置的详细信息:
对于您的项目,您需要将以下内容添加到您的项目中。
<PropertyGroup>
<AndroidTlsProvider>btls</AndroidTlsProvider>
</PropertyGroup>
此外,您是否通过浏览器验证了 URL 并且身份验证在与应用程序 运行 相同的设备上有效?
您能否也提供诊断构建输出和错误跟踪,以便我们更多地了解实际异常是什么?
我正在尝试使用 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 实施而看到这些错误。可以在此处找到有关配置的详细信息:
对于您的项目,您需要将以下内容添加到您的项目中。
<PropertyGroup>
<AndroidTlsProvider>btls</AndroidTlsProvider>
</PropertyGroup>
此外,您是否通过浏览器验证了 URL 并且身份验证在与应用程序 运行 相同的设备上有效?
您能否也提供诊断构建输出和错误跟踪,以便我们更多地了解实际异常是什么?