Restsharp harus mengirim header Host apa adanya tanpa mengubah port dalam nilai header Host.
https://github.com/minio/minio-dotnet/pull/212 membawa Restsharp 106.2.1 alih-alih Restsharp.Netcore (versi non resmi dengan dukungan .netcore). Namun, kami menemukan kesalahan ketidakcocokan tanda tangan karena autentikator khusus yang digunakan oleh minio dotnet sdk membuat tanda tangan otorisasi menggunakan ip:port sebagai nilai untuk header "Host". Restsharp httpclient tampaknya melepaskan port, karena jejak server hanya menunjukkan ip di nilai header Host.
port sedang dilucuti nilai header "Host" di 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]]
Apakah ada cara untuk mereproduksinya dalam tes sederhana?
https://github.com/poornas/restsharp-test - ini adalah proyek tulang telanjang menggunakan restsharp untuk membuat daftar ember panggilan ke server minio. Ini menggunakan autentikator khusus - Anda akan melihat bahwa itu gagal karena ketidakcocokan tanda tangan. setelah permintaan diteruskan ke restsharp, port dilucuti sebelum diteruskan ke server.
Terima kasih. Saya akan melihat dan mencoba memperbaikinya.
Terima kasih!
@alexeyzimarev Ada ide tentang apa yang menyebabkan ini?
@alexeyzimarev , apakah Anda memiliki kesempatan untuk melihat ini? Terima kasih
Mengecek sekarang
Saya mengkloning repro Anda dan saya melihat ini:
"parameters": [
...
{
"name": "Host",
"value": "play.minio.io:9000",
"type": "HttpHeader"
}
Apakah maksud Anda bahwa parameter dalam permintaan baik-baik saja tetapi nilainya tidak dikirim dengan benar ke server?
@alexeyzimarev , itu benar - jejak yang Anda lihat di atas adalah sebelum memanggil executeAsync. Saat ExecuteAsync dipanggil, Restsharp memanggil metode Otentikasi, di mana kami mengatur header otorisasi tanda tangan berdasarkan url:port di autentikator khusus. port tampaknya dilucuti oleh Restsharp sebelum mengenai server dan setelah panggilan Authenticate().
Ada pembaruan tentang ini? Kami diblokir cukup keras dalam hal ini.
Maaf saya belum bisa melihat ini dulu. Jika ini sangat kritis, mungkinkah kalian bisa menghabiskan waktu satu jam untuk men-debug-nya?
Saya melihat sekilas tentang ini. Sejauh yang saya tahu, masalahnya di sini sebenarnya bukan dengan RestSharp, tetapi sebenarnya HttpWebRequest
di System.Net
!
Pada saat RestSharp telah menyerahkan permintaan ke System.Net, properti Host
(Uri) di HttpWebRequest
masih berisi informasi port. Namun, ketika .SendRequest()
dipanggil, header Host yang digunakan hanya diisi oleh URI Host, bukan Host dan port .
Ini adalah tangkapan layar debugger saya di tautan di atas.
Ini jelas bertentangan dengan spesifikasi HTTP yang menghargai penggunaan port.
Seseorang tolong perbaiki saya jika saya salah, karena saya tidak pernah menemukan bug dalam kerangka dotnet, dan biasanya ketika saya pikir saya sudah - saya belum. Kalau tidak, saya kira langkah selanjutnya adalah mengangkat masalah ini pada repo CoreFX?
Mari kita angkat!
Selesai - mari kita lihat apakah ini sah di mana bug itu berada atau tidak.
Hanya ingin tahu - apakah ada yang tahu apakah itu regresi dengan .NET Core baru-baru ini? (2.1) Atau dengan kandang terakhir (2.0)? Atau perbedaan .NET Framework vs .NET Core, atau perbedaan antara OS Windows vs Linux? ("tidak tahu" adalah jawaban yang bagus, terima kasih!)
@karelz TBH saya melihat masalah ini untuk menyelesaikan masalah lain sehingga saya bisa berhenti mendapatkan peringatan kompiler bagi saya ini "tidak tahu", saya hanya mencoba ini di .NET Core 2.0 di MacOS. Pustaka ini hanya baru-baru ini (mungkin beberapa bulan) ditingkatkan untuk mendukung .NET Core hanya dengan .NET Framework. Mungkin @alexeyzimarev mungkin tahu lebih banyak?
Oke, jadi setidaknya Anda tahu: Ini berfungsi di .NET Framework (Windows) dan gagal di .NET Core 2.0 (Mac). Apakah itu ringkasan yang benar?
Tidak - dari utas lain yang saya ikuti, saya akan mengatakan itu gagal semua platform di .NET Core 2.0, dan saya tidak tahu tentang .NET Framework.
@karelz saya akan mengatakan bahwa asumsi itu benar. Saya baru saja mengubah dari kerangka kerja penuh ke .net core/standard dan kemudian tesnya rusak. Saya tidak yakin apakah ini regresi dari 1.x karena kami hanya mencoba bermigrasi ke .net standar 2.0
@niemyjski terima kasih atas konfirmasinya. Cukup sekian info kali ini. Saya hanya mencari fakta / pengalaman yang diketahui.
Apakah kita membiarkan masalah ini terbuka?
Perbaikan di CoreFx ada di PR: https://github.com/dotnet/corefx/pull/28375
Ya :)
Terima kasih
-Blake Niemyjski
Pada Kam, 22 Mar 2018 jam 15:57, Caesar [email protected]
menulis:
Perbaikan di CoreFx ada di PR: dotnet/corefx#28375
https://github.com/dotnet/corefx/pull/28375—
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375454963 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AA-So67a2QfPq72jMHNxaSCBhDXiWXOMks5thBAygaJpZM4SOXLx
.
Apakah ada alasan mengapa kami tidak dapat beralih ke HttpClient yang jauh lebih cepat?
dan lebih mudah untuk bekerja dengan? Itu tidak akan memiliki masalah ini?
Terima kasih
-Blake Niemyjski
Pada Jumat, 23 Mar 2018 pukul 07.14, Blake Niemyjski [email protected]
menulis:
Ya :)
Terima kasih
-Blake NiemyjskiPada Kam, 22 Mar 2018 jam 15:57, Caesar [email protected]
menulis:Perbaikan di CoreFx ada di PR: dotnet/corefx#28375
https://github.com/dotnet/corefx/pull/28375—
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375454963 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AA-So67a2QfPq72jMHNxaSCBhDXiWXOMks5thBAygaJpZM4SOXLx
.
@niemyjski maksud Anda Anda beralih dari RestSharp menggunakan HttpClient
bukannya HttpWebRequest
?
Ya :)
Terima kasih
-Blake Niemyjski
Pada Jum, 23 Mar 2018 jam 09:22, Alexey Zimarev [email protected]
menulis:
@niemyjski https://github.com/niemyjski maksud Anda Anda beralih
RestSharp menggunakan HttpClient alih-alih HttpWebRequest?—
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/restsharp/RestSharp/issues/1085#issuecomment-375680769 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AA-So0cbK66_Nq-MRdk0xwdb7sLPSGUoks5thQUUgaJpZM4SOXLx
.
@niemyjski pertanyaannya adalah satu _atau_ yang lain, _yes_ benar-benar bukan jawaban yang valid :)
Jika maksud Anda RestSharp harus menggunakan HttpClient
- Saya pro tetapi terakhir kali saya mencobanya, banyak pekerjaan yang harus dilakukan untuk mencocokkan semua parameter di RestClient.
Ya, kita harus beralih ke HttpClient yang lebih fleksibel, memiliki kinerja lebih baik, dan api modern yang kita tahu berfungsi di mana saja. Kita bisa melakukan beberapa perubahan besar dan menabrak yang utama :)
Ya, saya baik-baik saja melakukan ini tetapi saya tidak melakukannya sendiri. Saya mencoba dan itu terlalu banyak pekerjaan. Saya juga akan menghapus panggilan Async yang menerima panggilan balik. ContinueWith seharusnya baik-baik saja.
Sepertinya ini telah digabung menjadi 2.1, haruskah kita mengeluarkan nightly yang mereferensikan pratinjau baru 2 bit dan kita dapat memindahkan paket lain lama? Apakah ada pekerjaan yang dapat kami lakukan untuk <2.1 runtimes/libs?
Saya tidak punya ide tentang solusi
Saya perlu melakukan rilis terlebih dahulu sebelum saya dapat mengubah prarilis ke referensi 2.1 pratinjau
Apakah ini telah diselesaikan? Paket 2.1 rtm ada di nuget.
Jadi, Anda perlu mencoba menggunakan 2.1 dan melihat apakah mereka memperbaikinya?
@niemyjski komentar saya dari tanggal 20 April itu bodoh. Saya tidak perlu menunjuk apa pun di mana pun. Pustaka mengkompilasi ke .NET Standard 2.0. Kesalahan ini disebabkan oleh bug di runtime .NET Core 2.0 sehingga segera setelah Anda membangun kembali aplikasi Anda dengan .NET Core 2.1, jika masalah telah diperbaiki, itu akan mulai berfungsi. Maaf tentang kebingungan.
Komentar yang paling membantu
Mari kita angkat!