HTTPClient datei mit Anmeldedaten herunterladen

  • VB.NET
  • .NET 5–6

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von J.Herbrich.

    HTTPClient datei mit Anmeldedaten herunterladen

    Servus,

    ich versuche gerade mittels dem HttpClient eine Datei herunterzuladen, welche nur verfügbar ist, sofern man sich anmeldet. Leider funktioniert es nicht so (welch ein wunder. warum sollte ich hier ein Thema dazu eröffnen.) Per Suchfunktion und google konnte ich den fehler auch nicht finden.

    VB.NET-Quellcode

    1. Sub Main()
    2. downloadFile()
    3. While IsActive ' warten, bis downloadFile fertig ist
    4. End While
    5. End Sub
    6. Async Sub downloadFile()
    7. Dim Login As New NetworkCredential(User, Password)
    8. Dim handler As New HttpClientHandler
    9. handler.Credentials = Login
    10. Dim http As New HttpClient(handler)
    11. Try
    12. Using response As HttpResponseMessage = Await http.GetAsync(URL)
    13. response.EnsureSuccessStatusCode()
    14. Dim responseBody As String = Await response.Content.ReadAsStringAsync()
    15. Console.WriteLine(responseBody)
    16. End Using
    17. Catch e As HttpRequestException
    18. Console.WriteLine(Environment.NewLine & "Exception Caught!")
    19. Console.WriteLine("Message :{0} ", e.Message)
    20. End Try
    21. IsActive = False
    22. End Sub


    Ich werde dann ständig auf die Seite zum einloggen weitergeleitet.
    Zwischenfrage: Warum machst Du die Methode downloadFile nebenläufig (Async), wenn Du in Sub Main() mit der Fast-Endlos-While-Schleife dann doch wieder darauf wartest, dass sie fertig wird?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Und welche Login Methode benutzt die Seite?
    Irgend ein selbst geschriebener Login, Basic, NTLM/Kerberos oder was auch immer?

    Einfach etwas an die Wand zu werfen und schauen was hängen bleibt ist nicht sonderlich produktiv und zielführend.
    Hm gute Frage, meist weiß ich durch drauf schauen in welche Richtung ich schauen muss oder ich habe die Seite/Software aufgesetzt oder die Dokumentation verrät es mir.

    Ist es wie hier im Forum, mit dem Login oder kommt durch den Browser ein Pop-up?
    Du könntest vor dem Login die Developer Tools vom Browser öffnen und dir dann den Netzwerkverkehr anschauen, alternativ mit Tools wie Fiddler den gesamten HTTP Verkehr auslesen und schauen.
    Dann musst du dir anschauen welche Parameter für den Login notwendig sind und die wahrscheinlich als POST Request an den entsprechenden Endpunkt schicken, danach wahrscheinlich den Cookie mit nehmen und für deinen Download Request mitschicken.

    Aber da können wir nur spekulieren, da wir nichts über die Seite wissen.

    Eventuell biete die Seite auch eine API an, aber auch das können wir so nicht wissen.
    okay, also nach langer suche habe ich nun endlich den richtigen eintrag gefunden. Dieser wird per POST im Format:
    ?subUserId=&loginID=loginid&password=password&go=&_FORM_ID= HTTP/1.1
    übergeben

    Also für mich sieht es nach einer normalen "Basic" login aus

    So, ich hab das gerade mal ein kleines testprogramm versucht. Ergebnis: ich bin zu doof dazu. Hier mal mein Code:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. HoleDaten()
    3. End Sub
    4. Async Sub HoleDaten()
    5. Dim content_type As String = "text/html"
    6. Dim httpClient As HttpClient = New HttpClient()
    7. Dim httpContent = New StringContent("?subUserId=&loginId=" & User & "password=" & Password & "&go=&__FORM_ID= HTTP/1.1 HTTP/1.1", System.Text.Encoding.UTF8, content_type)
    8. Dim response = Await httpClient.PostAsync(SeiteMitInfos, httpContent)
    9. TextBox1.Text = Await response.Content.ReadAsStringAsync


    Ergebnis ist immer, das ich nicht authorisiert bin, die Seite aufzurufen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „trix0“ ()

    Gepriesen sei Das Rauhe Haus,

    Nun, du kannst HTTP Request Header mit senden zwecks Autentifizierung. Problem ist, wenn der Server HTTP Basic nutzt läuft das über ein header. Man kann (bin mir nicht sicher ob es nur die Webbrowser machen oder ob es HTTP nach RFC ist http://<user>.<passwort>@example.com/file.txt machen.

    Hier swagger.io/docs/specification/…thentication/#:~:text=The client sends HTTP requests,Authorization%3A Basic ZGVtbzpwQDU1dzByZA%3D%3D findest du die Spezifikation zur HTTP Basic Autentifikation.

    So, Problematischer wird es wenn eine WebForm zum Einsatz kommt (Login Website, sry für den ASP.NET Sprech aber gilt auch bei PHP und anderen Backends) dann musst du mit einen HTTP Websniffer schauen welche POST Attribute verwendet werden und ein HTTP Post Request mitschicken. Nachteil, du musst dann noch irgendwie das Cookie abfangen aus deiner HTTP Response und dieses beim Download HTTP Request mitschicken.

    Ich hoffe ich konnte Helfen,

    LG, Herbrich