Wie realisiere ich in .NET einen Webserver?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Thisoft.

    Vielen Dank für die Hinweise zu den Ports etc. Das hilft mir sehr viel weiter.

    Später soll die Anwendung selbstgehostet als Dienst laufen. Da wäre dann ohnehin nochmal meine Frage wie ich einen Dienst draus machen kann...?
    Dafür brauchst du das Microsoft.Extensions.Hosting.WindowsServices Paket und musst die Zeile .UseWindowsService(); hinzuzufügen:

    C#-Quellcode

    1. public static IHostBuilder CreateHostBuilder(string[] args) =>
    2. Host.CreateDefaultBuilder(args)
    3. .ConfigureWebHostDefaults(webBuilder =>
    4. {
    5. webBuilder.UseStartup<Startup>()
    6. .UseUrls("http://*:5001", "https://*:5002");
    7. })
    8. .UseWindowsService();

    Danach kannst du mithilfe des Kommandozeilentools sc den Dienst registrieren
    Danke schon mal. Mit dem Dienst das teste ich im übernächsten Schritt ;)

    Momentan habe ich ein neues Problem. Ich teste jetzt mit meinem Webserver nicht mehr lokal sondern wie beabsichtigt auf einem Server. Läuft im Prinzip, aber beim Versuch von einer Website mittels JavaScript Daten abzurufen erhalte ich folgenden Fehler:
    Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://10.60.100.112:5001/api/MaschInfos. (Grund: CORS-Anschlag schlug fehl)
    Irgendwie erzählt das Netz dazu dass ich irgend eine Header-Eigenschaft dazufügen müsste, aber mir wird nicht klar wo und wie ich das machen müsste... Könnt ihr mir da nochmal helfen?

    EDIT: Bin ein Stück weiter. HAbe jetzt in der Startup.cs alles eingetragen was ich lt. Hilfe so dazu finden konnte:

    C#-Quellcode

    1. public void ConfigureServices(IServiceCollection services)
    2. {
    3. services.AddDbContext<TodoContext>(opt =>
    4. opt.UseInMemoryDatabase("TodoList"));
    5. services.AddControllers();
    6. services.AddDbContext<MES_Server.Modelle.MaschContext>(opt =>
    7. opt.UseInMemoryDatabase("MaschList"));
    8. services.AddCors(options =>
    9. {
    10. options.AddPolicy(name: MyAllowSpecificOrigins,
    11. builder =>
    12. {
    13. builder.AllowAnyOrigin()
    14. .SetIsOriginAllowedToAllowWildcardSubdomains()
    15. .AllowAnyHeader()
    16. .AllowAnyMethod()
    17. .WithMethods("POST", "DELETE", "GET")
    18. ;
    19. });
    20. });
    21. services.AddControllers();
    22. }
    23. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    24. {
    25. if (env.IsDevelopment())
    26. {
    27. app.UseDeveloperExceptionPage();
    28. }
    29. app.UseHttpsRedirection();
    30. app.UseRouting();
    31. app.UseCors(MyAllowSpecificOrigins);
    32. app.UseAuthorization();
    33. app.UseEndpoints(endpoints =>
    34. {
    35. endpoints.MapControllers();
    36. });
    37. }
    38. }


    Allerdings erhalte ich beim Requst immer noch die Fehlermeldung dass die entsprechenden CORS-Kopfzeilen fehlen würden... :( Kann ich irgendwie in der Anwendung selbst prüfen, ob die entsprechenden Optionen auch wirklich aktiviert sind, z.B. den Request-Header in der Konsole ausgeben lassen oder so?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thisoft“ ()

    muss den Beitrag mal etwas pushen...

    Kennt hier wirklich niemand diese CORS-Geschichte? Mach ich mir's gerade zu kompliziert und seh den Wald vor lauter Bäumen nicht? Gibt es einen anderen Weg zum Abrufen der Daten der das Problem umgeht?
    Naja, das Komische ist ja dass ich mir eigentlich sicher bin dass der Header da ist. Wenn ich den gleichen GET-Request mit Postman ausführe erhalte ich unten angefügte Ausgabe. Aber die Website sagt mir als Ergebnis des Javascript-Requests beharrlich 'Access-Control-Allow-Origin' fehlt

    Ich bin verwirrt - ist die Fehlermeldung irreführend und das Problem liegt woanders?
    Bilder
    • Postman.jpg

      57,55 kB, 938×247, 63 mal angesehen
    Wenn ich das richtig verstanden habe, dann wird die Meldung 'Access-Control-Allow-Origin' fehlt auch dann generiert, wenn ein einzelnes Element im CORS nicht enthalten ist.

    Werden hier für den Zugriff auf die API unter Umständen Anmeldedaten benötigt? Dann reicht crossorigin = anonymous nicht. Dann muss crossorigin auf use-credentials stehen.

    Ich muss dazu sagen, dass ich generell Webprojekte nur im Azure-Umfeld realisiere und jeden Zugriff auf eine API gegen einen Microsoft AAD-Account verifizieren muss. Daher ist das nur ins Blaue geraten.

    EDIT: Wo steht der Server? Unter Umständen kann auch die Firewall das Problem sein.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Yanbel“ ()

    Du hast dir aber schon einmal angeschaut was CORS ist oder? de.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

    Du musst natürlich auf deinem Server wo die API läuft den Header setzen das der Server der den Request sendet das auch darf.
    Wenn du möchtest das jeder deine API nutzen kann setzte den Header auf: "Access-Control-Allow-Origin: *".

    Siehe hier nochmal für die Header Values: developer.mozilla.org/en-US/do…cess-Control-Allow-Origin

    Hier dazu auch nochmal nen Artikel bei docs.microsoft: docs.microsoft.com/de-de/aspne…/cors?view=aspnetcore-3.1
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Oh - ja. Das ist ein guter Ansatz :thumbup:
    crossorigin hab ich auf use-credentials umgestellt. Das ändert allerdings bis jetzt gar nichts an der Fehlermeldung. Kann aber gut sein dass noch ein anderes Element generell fehlt.. Gibt's da irgendwo eine Aufstellung was alles vorhanden sein muss?

    Anderer Ansatz - wenn du gegen MS-AAD-Accounts verifizierst dann ist das doch vermutlich nicht so generell anders als gegen das lokale AD zu verifizieren - oder? Hättest du da vielleicht ein Beispiel für mich? Mit der Verifizierung könnte ich mich generell auch anfreunden, ich dachte nur dass ich erstmal den "einfacheren" Weg gehen wollte :S
    Der einfachste Weg über ein lokales AD zu verifizieren ist der, dass du dein lokalen AD mit einem Azure Active Directory verknüpfst. Dann kannst du gegen den AAD-Account verifizieren und der holt sich bei Bedarf die Daten aus deinem lokalen AD.

    Ist hier denke ich ganz gut beschrieben:

    docs.microsoft.com/de-de/azure…-protect-backend-with-aad

    EDIT: docs.microsoft.com/de-de/azure…ry/develop/sample-v2-code



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    xChRoNiKx schrieb:

    Du hast dir aber schon einmal angeschaut was CORS ist oder? de.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

    Du musst natürlich auf deinem Server wo die API läuft den Header setzen das der Server der den Request sendet das auch darf.


    Jetzt bin ich schon wieder verwirrt ?( Du hast aber schon oben meinen Post #23 gelesen oder? Ist das so völlig falsch was ich da von der von dir angegebenen Website übernommen habe?

    Und dass ich in meiner API die Header gesetzt habe, hab ich doch in Post #26 geschrieben...!?

    Wo ist da mein Problem???
    Nein, generell falsch ist das nicht, aber du hattest gefragt, wie du gegen das AD authentifizieren kannst. Meine Quellen bezogen sich nur auf diese Frage.

    Wie gesagt, die Meldung die du bekommst ist eine sehr allgemeine Meldung. Das kann an deiner Netzwerkkonfiguration liegen, an der Firewall oder an fehlenden Infos im CORS. Ohne all diese Konfigurationsdaten ist es spekulativ zu sagen, warum der Fehler ausgelöst wird. Bei dem was ich gelesen habe, liegt der Fehler in 90% an einer fehlenden Firewall-Freigabe. Aber das lässt sich nicht mit Sicherheit sagen.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Yanbel schrieb:

    Nein, generell falsch ist das nicht, aber du hattest gefragt...


    Sorry, mit meinem letzten Post meinte ich xChRoNiKx...

    Mit der Firewall das war auch schon meine Vermutung, habe ich schon mal auf beiden beteiligten Rechnern die Ports 5010 und 5011 die ich verwende freigeschalten und auch testweise mal die Firewall ganz ausgeschalten - der Fehler bleibt der Gleiche... Werden denn evtl. noch andere Ports benötigt für diese Geschichte?

    Was könnte denn an der Netzwerkkonfiguration noch haken?

    Vermutlich geht es doch in die Richtung dass noch irgendwas im HEader fehlt. Hab nämlich gerade mal auf "localhost" den Request getestet und da klappt's auch nicht. Meldung: CORS-Anschlag schlug fehl
    Ich werde mal ein wenig in Richtung AD-Authentifizierung herumprobieren. Aber nur direkt - für Azure müsste ich erst Azure überhaupt incl. AD-Verknüpfung etc. einrichten. Das geht mir nur dafür im Moment doch etwas zu weit und sind mir auch irgendwie zu viele Unbekannte auf einmal. Oder geht Authentication auf's lokale AD etwa nicht?

    Eine Frage hab ich noch: Wie kann ich denn zum Debuggen Ausgaben in die Console schreiben lassen? Hab mit einigem probieren noch keinen Weg dafür in ASP.NET gefunden :( Is bestimmt ganz einfach - oder?
    Specifying AllowAnyOrigin and AllowCredentials is an insecure configuration and can result in cross-site request forgery. For a secure app, specify an exact list of origins if the client must authorize itself to access server resources.


    Enable Cross-Origin Requests (CORS) in ASP.NET Core, sollte helfen.
    Die gute Nachricht :) Es läuft! Die Hauptursache war wohl dass ich diese ganzen CORS-Einstellungen nur im Service in der Startup.cs gemacht hatte. Die entsprechenden HEader müssen aber wohl auch in den ActionResults definiert werden.

    Nun die nächste Frage zur Sicherheit! Kann ich der "Antwort" ein Zertifikat "mitgeben" damit die Browser nicht alle herumschimpfen und Böses hinter meinen paar Bytes vermuten ;) ??
    HAllo und sorry - ich muss die Frage nach dem Zertifikat nochmal pushen...

    Also, wenn ich von einem einem beliebigen Rechner im Netzwerk eine Anfrage an meinen Webserver schicke bekomme ich die untenstehende Sicherheitswarnung zurück. Nun kann man die zwar einmal bestätigen, also die Ausnahme hinzufügen und gut. Lieber wäre mir aber wenn ich's "richtig" machen könnte. Nur wie???

    Naja, du brauchst ein SSL/TLS Zertifikat dem Vertraut wird.

    Ist der Dienst übers Internet aufrufbar, kannst du dir via Let's Encrypt ein kostenloses Zertifikat besorgen, mithilfe von Windows in den Zertifikatspeicher aufnehmen, und dann in deinem Dienst abrufen und als Zertifikat einstellen.

    Wenn der Dienst nur Intern läuft, dann brauchst du, wenn es ein Einzelfall ist, ein selbst-signiertes Zertifikat, das du auf allen Rechnern, die auf den Dienst zugreifen, installieren musst, damit dem vertraut wird.

    Nützlicher wäre natürlich eine interne Certificate Authority zu haben, der von allen Rechnern vertraut wird, sodass du weitere Zertifikate erstellen kannst, ohne dass man diese immer auf allen Rechnern installieren muss.
    Ähm ja, das ist mir ja alles so einigermaßen klar... Meine Frage ist - wie hinterlege ich das Zertifikat in meinem Dienst? Da fehlt mir der Ansatz...

    Achso, ja übers Internet soll da nichts erreichbar sein, nur im lokalen Netz (bzw. VPN).
    Ich gehe davon aus, dass das Zertifikat im Zertifikatspeicher von Windows hinterlegt ist.

    So rufst du ein Zertifikat ab:
    codeproject.com/Tips/829747/Ge…tes-from-the-System-Store

    Und so weißt du es Kestrel zu:
    docs.microsoft.com/de-de/aspne…sconnectionadapteroptions

    Da ich meine Anwendungen in einem IIS hoste, kann ich dir leider keine Garantie abgeben.

    Falls du eine .pfx rumliegen hast, geht das so:
    stackoverflow.com/questions/46…strel-in-asp-net-core-2-x