Restsharp: port sedang dilucuti header host

Dibuat pada 21 Feb 2018  ·  35Komentar  ·  Sumber: restsharp/RestSharp

Perilaku yang Diharapkan

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.

Perilaku Sebenarnya

port sedang dilucuti nilai header "Host" di Restsharp 106.2.1

Langkah-langkah untuk Mereproduksi Masalah

  1. clone minio-dotnet sdk dan dapatkan patch https://github.com/minio/minio-dotnet/pull/212
    minio-dotnet git:(02cbcb5) pemulihan dotnet; pembuatan dotnet
    minio-dotnet git:(02cbcb5) dotnet run --project SimpleTest
    2.
    3.

spesifikasi

Jejak Tumpukan

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]]

Komentar yang paling membantu

Mari kita angkat!

Semua 35 komentar

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.
screen shot 2018-03-22 at 11 22 52 am

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 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
.

@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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat