Restsharp должен отправлять заголовок узла как есть, не изменяя порт в значении заголовка узла.
https://github.com/minio/minio-dotnet/pull/212 добавляет Restsharp 106.2.1 вместо Restsharp.Netcore (неофициальная версия с поддержкой .netcore). Однако мы обнаружили ошибки несоответствия подписи, поскольку настраиваемый аутентификатор, используемый minio dotnet sdk, создает подпись авторизации, используя ip:port в качестве значения для заголовка «Host». Restsharp httpclient, похоже, отключает порт, поскольку трассировка сервера показывает только ip в значении заголовка хоста.
порт удаляется из значения заголовка «Host» в Restsharp 106.2.1
minio-dotnet client side trace
---------------------------------------
Full URL of Request http://192.168.1.157:9000/
Request completed in 90.1376 ms, Request: {
"resource": "/",
"parameters": [
{
"name": "x-amz-content-sha256",
"value": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"type": "HttpHeader"
},
{
"name": "Host",
"value": "192.168.1.157:9000",
"type": "HttpHeader"
},
{
"name": "x-amz-date",
"value": "20180221T205958Z",
"type": "HttpHeader"
},
{
"name": "Authorization",
"value": "AWS4-HMAC-SHA256 Credential=minio/20180221/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=db0fbcc9aa66975a530a2621962a87787559289a218da881420686263da862df",
"type": "HttpHeader"
},
{
"name": "Accept",
"value": "application/json, application/xml, text/json, text/x-json, text/javascript, text/xml",
"type": "HttpHeader"
}
],
"method": "GET",
"uri": "http://192.168.1.157:9000/"
}, Response: {
"statusCode": 403,
"content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><Key></Key><BucketName></BucketName><Resource>/</Resource><RequestId>3L137</RequestId><HostId>3L137</HostId></Error>",
"headers": [
{
"Name": "Accept-Ranges",
"Value": "bytes",
"Type": 3,
"ContentType": null
},
{
"Name": "Server",
"Value": "Minio/DEVELOPMENT.GOGET, (linux; amd64)",
"Type": 3,
"ContentType": null
},
{
"Name": "Vary",
"Value": "Origin",
"Type": 3,
"ContentType": null
},
{
"Name": "X-Amz-Request-Id",
"Value": "151572E9DCF94747",
"Type": 3,
"ContentType": null
},
{
"Name": "Date",
"Value": "Wed, 21 Feb 2018 20:59:58 GMT",
"Type": 3,
"ContentType": null
},
{
"Name": "Transfer-Encoding",
"Value": "chunked",
"Type": 3,
"ContentType": null
},
{
"Name": "Content-Type",
"Value": "application/xml",
"Type": 3,
"ContentType": null
}
],
"responseUri": "http://192.168.1.157:9000/",
"errorMessage": null
}
I'm not handling the Minio.Exceptions.MinioException.
Unhandled Exception: System.AggregateException: One or more errors occurred. (Minio API responded with message=The request signature we calculated does not match the signature you provided. Check your key and signing method.) (Minio API responded with message=The request signature we calculated does not match the signature you provided. Check your key and signing method.) ---> Minio.Exceptions.MinioException: Minio API responded with message=The request signature we calculated does not match the signature you provided. Check your key and signing method.
at Minio.MinioClient.ParseError(IRestResponse response) in /home/kris/code/minio-dotnet/Minio/MinioClient.cs:line 475
at Minio.MinioClient.<>c.<.ctor>b__78_0(IRestResponse response) in /home/kris/code/minio-dotnet/Minio/MinioClient.cs:line 70
at Minio.MinioClient.HandleIfErrorResponse(IRestResponse response, IEnumerable`1 handlers, DateTime startTime) in /home/kris/code/minio-dotnet/Minio/MinioClient.cs:line 502
at Minio.MinioClient.<ExecuteTaskAsync>d__81.MoveNext() in /home/kris/code/minio-dotnet/Minio/MinioClient.cs:line 349
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Minio.MinioClient.<ListBucketsAsync>d__0.MoveNext() in /home/kris/code/minio-dotnet/Minio/ApiEndpoints/BucketOperations.cs:line 52
--- End of inner exception stack trace ---
at System.AggregateException.Handle(Func`2 predicate)
at SimpleTest.Program.Main(String[] args) in /home/kris/code/minio-dotnet/SimpleTest/Program.cs:line 47
Server side trace:
--------------------------
➜ minio git:(debugnet) minio server ~/ex
Drive Capacity: 6.9 GiB Free, 221 GiB Total
Endpoint: http://192.168.1.157:9000 http://172.17.0.1:9000 http://172.18.0.1:9000 http://172.19.0.1:9000 http://172.20.0.1:9000 http://127.0.0.1:9000
AccessKey: minio
SecretKey: minio123
Browser Access:
http://192.168.1.157:9000 http://172.17.0.1:9000 http://172.18.0.1:9000 http://172.19.0.1:9000 http://172.20.0.1:9000 http://127.0.0.1:9000
Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
$ mc config host add myminio http://192.168.1.157:9000 minio minio123
Object API (Amazon S3 compatible):
Go: https://docs.minio.io/docs/golang-client-quickstart-guide
Java: https://docs.minio.io/docs/java-client-quickstart-guide
Python: https://docs.minio.io/docs/python-client-quickstart-guide
JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide
.NET: https://docs.minio.io/docs/dotnet-client-quickstart-guide
signed headers .... map[X-Amz-Content-Sha256:[e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855] X-Amz-Date:[20180221T205638Z] Host:[192.168.1.157]]
Есть ли способ воспроизвести это в простом тесте?
https://github.com/poornas/restsharp-test — это проект с голыми костями, использующий restsharp для выполнения вызова корзин списка на сервер minio. Он использует собственный аутентификатор — вы увидите, что он не работает из-за несоответствия подписи. как только запрос передается в restsharp, порт отключается, прежде чем он будет передан на сервер.
Спасибо. Я посмотрю и постараюсь исправить.
Спасибо!
@alexeyzimarev Есть идеи, что может быть причиной этого?
@alexeyzimarev , у вас уже была возможность изучить это? Спасибо
Проверка сейчас
Я клонировал вашу реплику и вижу это:
"parameters": [
...
{
"name": "Host",
"value": "play.minio.io:9000",
"type": "HttpHeader"
}
Вы имеете в виду, что параметры в запросе в порядке, но значение не отправляется на сервер должным образом?
@alexeyzimarev , это правильно - трассировка, которую вы видите выше, идет до вызова executeAsync. Когда вызывается ExecuteAsync, Restsharp вызывает метод Authenticate, где мы устанавливаем заголовок авторизации подписи на основе url:port в пользовательском аутентификаторе. порт, похоже, был удален Restsharp перед попаданием на сервер и после вызова Authenticate().
Есть новости по этому поводу? Мы довольно сильно заблокированы в этом.
Жаль, что я не мог пока посмотреть на это. Если это очень критично, может быть, вы, ребята, можете потратить час на отладку?
Я быстро рассмотрел это. Насколько я могу судить, проблема здесь на самом деле не с RestSharp, а на самом деле HttpWebRequest
в System.Net
!
К тому времени, когда RestSharp передаст запрос в System.Net, свойство Host
(Uri) в HttpWebRequest
все еще содержит информацию о порте. Однако при вызове .SendRequest()
используемый заголовок Host заполняется только хостом URI, а не хостом и портом .
Вот скриншот моего отладчика по ссылке выше.
Это явно противоречит спецификации HTTP , которая учитывает использование портов.
Кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь, потому что я никогда не находил бага в фреймворке dotnet, а обычно, когда я думаю, что нашел, — нет. В противном случае я полагаю, что следующими шагами будет поднятие этой проблемы в репозитории CoreFX?
Поднимем!
Сделано - давайте посмотрим, законно ли это, где ошибка или нет.
Просто любопытно - кто-нибудь знает, является ли это регрессом с недавним .NET Core? (2.1) Или с последней стабильной (2.0)? Или отличие .NET Framework от .NET Core, или отличие ОС Windows от Linux? («не знаю» — хороший ответ, спасибо!)
@karelz TBH Я изучил эту проблему, чтобы решить другую проблему, чтобы я мог перестать получать предупреждения компилятора 😆 для меня это «не знаю», я пробовал это только на .NET Core 2.0 на MacOS. Эта библиотека только недавно (может быть, несколько месяцев) была обновлена для поддержки .NET Core, а не только .NET Framework. Может, @alexeyzimarev знает больше?
Хорошо, по крайней мере, вы знаете: он работает на .NET Framework (Windows) и не работает на .NET Core 2.0 (Mac). Это правильное резюме?
Нет - из других тем, в которых я участвую, я бы сказал, что это не работает на всех платформах на .NET Core 2.0, и я не знаю о .NET Framework.
@karelz Я бы сказал, что это предположение было бы правильным. Я только что перешел с полного фреймворка на .net core/standard, а потом тесты сломались. Я не уверен, что это регрессия от 1.x, поскольку мы только пытались перейти на .net Standard 2.0.
@niemyjski спасибо за подтверждение. Это достаточная информация на данный момент. Я просто изучал известные факты/опыт.
Мы оставляем этот вопрос открытым?
Исправление в CoreFx есть в PR: https://github.com/dotnet/corefx/pull/28375
Да :)
Спасибо
-Блейк Нимийски
В четверг, 22 марта 2018 г., в 15:57, Цезарь Чен, [email protected]
написал:
Исправление в CoreFx находится в PR: dotnet/corefx#28375.
https://github.com/dotnet/corefx/pull/28375—
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375454963 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AA-So67a2QfPq72jMHNxaSCBhDXiWXOMks5thBAygaJpZM4SOXLx
.
Была ли какая-то причина, по которой мы не могли переключиться на HttpClient, который намного быстрее?
и легче работать? Этой проблемы не будет?
Спасибо
-Блейк Нимийски
В пятницу, 23 марта 2018 г., в 7:14, Блейк Ниемийски [email protected]
написал:
Да :)
Спасибо
-Блейк НимийскиВ четверг, 22 марта 2018 г., в 15:57, Цезарь Чен, [email protected]
написал:Исправление в CoreFx находится в PR: dotnet/corefx#28375.
https://github.com/dotnet/corefx/pull/28375—
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375454963 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AA-So67a2QfPq72jMHNxaSCBhDXiWXOMks5thBAygaJpZM4SOXLx
.
@niemyjski , вы имеете в виду, что переключатель RestSharp использует HttpClient
вместо HttpWebRequest
?
Да :)
Спасибо
-Блейк Нимийски
В пт, 23 марта 2018 г., в 9:22, Алексей Зимарев [email protected]
написал:
@niemyjski https://github.com/niemyjski вы имеете в виду, что вы переключаетесь
RestSharp использует HttpClient вместо HttpWebRequest?—
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375680769 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AA-So0cbK66_Nq-MRdk0xwdb7sLPSGUoks5thQUUgaJpZM4SOXLx
.
@niemyjski вопрос был один _или_ другой, _yes_ действительно неправильный ответ :)
Если вы имеете в виду, что RestSharp должен использовать HttpClient
- я за это, но в прошлый раз, когда я пытался, было много работы, чтобы сопоставить все параметры в RestClient.
Да, мы должны переключиться на HttpClient, который гораздо более гибкий, имеет лучшую производительность и современный API, который, как мы знаем, работает везде. Мы могли бы внести некоторые критические изменения и поднять основные :)
Да, я хорошо делаю это, но я не делаю это в одиночку. Я пытался, и это было слишком много работы. Я бы также удалил асинхронные вызовы, которые принимают обратные вызовы. ContinueWith должен быть в порядке.
Похоже, это было объединено с 2.1, должны ли мы выпускать ночную версию, которая ссылается на новый предварительный просмотр 2 бит, и мы можем перемещать другие пакеты на долгое время? Есть ли какие-то обходные пути, которые мы можем сделать для сред выполнения/библиотек < 2.1?
Я понятия не имею об обходных путях
Мне нужно сначала сделать выпуск, прежде чем я смогу изменить предварительный выпуск на предварительную версию 2.1.
Это было решено? Пакеты RTM 2.1 находятся на nuget.
Итак, вам нужно попробовать использовать 2.1 и посмотреть, исправили ли они это?
@niemyjski мой комментарий от 20 апреля глупый. Мне не нужно ничего никуда указывать. Библиотека компилируется в .NET Standard 2.0. Ошибка вызвана ошибкой в среде выполнения .NET Core 2.0, поэтому, как только вы перестроите свое приложение с помощью .NET Core 2.1, если проблема устранена, оно должно начать работать. Извините за путаницу.
Самый полезный комментарий
Поднимем!