Задача
Я получаю странную 401 несанкционированную ошибку при использовании Windows.Web.Http.HttpClient на Xbox One . На Windows На машинах все работает нормально. Учетные данные в порядке, и я тестировал на 3 разных Xbox One - каждый раз один и тот же результат.
Вот код:
Windows.Web.Http.Filters.HttpBaseProtocolFilter filter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
filter.AllowUI = false;
filter.CacheControl.WriteBehavior = Windows.Web.Http.Filters.HttpCacheWriteBehavior.NoCache;
filter.CacheControl.ReadBehavior = Windows.Web.Http.Filters.HttpCacheReadBehavior.NoCache;
Uri uri = new Uri("http://" + url + ":" + port + endpoint);
if (username != "" && password != "")
filter.ServerCredential = new Windows.Security.Credentials.PasswordCredential(uri.OriginalString, username, password);
try
{
HttpClient client = new HttpClient(filter);
HttpResponseMessage response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
var buffer = await response.Content.ReadAsBufferAsync();
var byteArray = buffer.ToArray();
return Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
}
catch
{
return null;
}
Вот вывод Fiddler (у меня в жестком коде username / pass zu, чтобы избежать ошибок при наборе).
Xbox One:
GET http://192.168.178.31:XXXX/XXX/XXX HTTP/1.1
Accept-Encoding: gzip, deflate
Host: 192.168.178.31:XXXX
Connection: Keep-Alive
Pragma: no-cache
HTTP/1.1 401 Unauthorized
Server: XXXX
Cache-Control: no-cache
WWW-Authenticate: Digest realm="XXXX", qop="auth", nonce="516f32c0f120024c220873c1ebc159e4", opaque="2effb29f8b3de0ca6a688330875890c8"
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 432
Windows
GET http://192.168.178.31:XXXX/XXX/XXX HTTP/1.1
Accept-Encoding: gzip, deflate
Host: 192.168.178.31:XXXX
Connection: Keep-Alive
Pragma: no-cache
HTTP/1.1 200 OK
Спасибо
Я снова создал небольшое приложение с несколькими строками кода. Теперь с System.NET.Http вместо Windows.Web.Http.
Странная вещь в том, что я получаю такой результат в фиддлере:
Windows
HTTP 401 Text/Html
HTTP 200 Text/x-json
Xbox:
HTTP 401 Text/Html
HTTP 401 Text/Html
Обход:
Сейчас я использую оба метода, если один не удается, он пытается использовать другой:
if (!digestFailed)
filter.ServerCredential = new Windows.Security.Credentials.PasswordCredential(uri.OriginalString, username, password);
else
request.Headers.Authorization = new HttpCredentialsHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", username, password))));
Но, похоже, на Xbox One есть большая проблема. Я играл с веб-сервером. Если на сервере установить аутентификацию только для дайджеста , Xbox будет неспособным подключиться! Поэтому я думаю, что что-то не так с генерацией дайджеста на Xbox с Windows.Security.Credentials.PasswordCredential ?
Чтобы было понятно:
Базовая аутентификация сервера:
Дайджест аутентификации сервера:
Дайджест аутентификации сервера + Basic:
- Windows OK (Аутентифицировано с помощью дайджеста)
- Xbox OK (Аутентифицировано с помощью Basic Auth)