Laden...
D
Davaaron
myCSharp.de - Member
41
Themen
106
Beiträge
Letzte Aktivität
vor 3 Jahren
Dabei seit
15.04.2016
Erstellt vor 3 Jahren

Ok, ich probiere es mal. Ich hoffe mal, dass die anderen Services dann dennoch auf die Datenbank zugreifen können 😄

Danke schon mal.

Edit: Super, hat einwandfrei funktioniert! Jetzt kann ich mich auch über SSMS einloggen und die Applikation läuft dennoch ganz normal, macht ja aber auch Sinn, weil die 31000 nur von Docker aus "exposed" wird und intern immer noch die 1433 genutzt wird.

Erstellt vor 3 Jahren

verwendetes Datenbanksystem: SQL Server

Hallo,

ich habe eine Entwicklungsumgebung vorliegen, bei der ein Docker-Image erstellt wird und in einem Docker-Container läuft. Das Image ist ein mssql-Image und dort wird eine DB inklusive Seeding und Migration erstellt.
Nun würde ich gerne von meinem Host über SQL Server Management Studio (SSMS) auf diese Datenbank zugreifen. Der ConnectionString für die DB beinhaltet

Data Source=localhost

sowie eine User ID und ein Passwort.
Versuche ich nun über SSMS diese Credentials (SQL Authentifizierung) einzugeben und trage als Servername "localhost" ein, bekomme ich einen Fehler:
"Fehler bei der Anmeldung für den Benutzer "sa" (Microsoft SQL Server, Fehler: 18456)"

Verwende ich statt der SQL Auth Methode die Windows Auth Methode, dann komme ich auf meine localhost Datenbank, allerdings ist dies nicht die DB aus dem Docker.

Hat jemand eine Idee, wie ich auf die Docker DB zugreifen kann? Leider kann ich an der docker-Datei nichts ändern.

Erstellt vor 4 Jahren

Wie fast immer: Ich schreibe einen Post und danach fällt mir die Lösung ein.. 😄

Der Name des Target-Elements muss auf "AfterBuild" gestellt werden und app.config muss App.config heißen. Das wars auch schon.

Erstellt vor 4 Jahren

Hi,

mein Ziel ist es, meine App.*.config Dateien bei jedem Build-Durchlauf zu transformieren, so dass immer die korrekte App.config bereitgestellt wird.
Dazu habe ich in meiner *.csproj folgendes hinzugefügt:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="CoreCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="app.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

Dies funktioniert, wenn der obj/Debug bzw obj/Release Ordner vorhanden sind und die *.exe ebenfalls. Lösche ich allerdings den obj-Ordner, dann funktioniert das Builden nicht mehr. Fehlermeldung:

  Microsoft.Common.CurrentVersion.targets(4187, 5): [MSB3030] Datei "obj\Debug\MeinProjekt.exe" konnte nicht kopiert werden, da die Datei nicht gefunden wurde.

Wieso wird diese Fehlermeldung geworfen? Ich versuche doch gar nicht auf die *.exe zuzugreifen. Vielleicht wegen der Variable $(TargetFilename)?

Erstellt vor 4 Jahren

Ich habe da ein eigenes Konstrukt, benutze kein OpenId oder OAuth2.
Mittlerweile habe ich es hinbekommen, dass mein Token in jedem Request mitgesendet wird und somit kann ich mich authorisieren.
Den JWT Token nutze ich im Header um den User zu authorisieren, der Refresh-Token ist ein Eigenkonstrukt.

Was meinst Du "in Swagger" ? Swagger ist ja nur ein "Protokoll", das hat ja keinen eigenen Controller.

Stimmt, ich meinte damit den Endpunkt zum Einloggen, den ich in Swagger UI sehe. Dieser Endpunkt hat ja einen Controller.

Fürs Protokoll: Du verwendest SwashBuckle, richtig?

Richtig.

Noch eine andere Frage (oder dazu einen eigenen Thread aufmachen?).
Ich würde gerne, bevor die index.html von Swagger UI aufgerufen wird, eine eigene HTML Seite anzeigen. Dies habe ich auch hinbekommen, indem ich den IndexStream überschrieben habe:


 app.UseSwaggerUI(c =>
            {
              
                c.IndexStream = () => GetType().GetTypeInfo().Assembly.GetManifestResourceStream("My.Custom.Namespace.Resources.firstPage.html");
            });

Nun würde ich gerne zur originalen Swagger UI Index.html navigieren. Dazu habe ich mir von Github das originale index.html heruntergeladen.
Das Problem: Ich weiß nicht, wie ich dahin navigieren soll. Beim Starten der WebAPI komme ich direkt auf "index.html", d.h. meine firstPage.html dient logischerweise als index.html. Die originale index.html von Swagger UI wird nicht migeladen.
Hat das schon mal jemand gemacht?

Erstellt vor 4 Jahren

Hi,

für meine Asp.Net Core Web Api habe ich einige Controller, die mit dem AuthorizeAttribute versehen sind. Für die Autorisierung benutze ich JWT Tokens. Nun will ich Swagger UI nutzen, um die WebAPI zu dokumentieren und zu testen.
Da nicht jeder die API nutzen können soll, will ich diese absichern, allerdings nicht mit einem JWT Token, sondern der Benutzer soll sich normal per Basic Auth autorisieren. Dafür habe ich auch keinen AuthController, der den JWT inklusive Refresh-Token zurückgibt.
Doch wie erreiche ich das?
In meiner Startup.cs habe ich folgenden Code:

  services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Web API", Version = "v1" });

                // add JWT Authentication
                var securityScheme = new OpenApiSecurityScheme
                {
                    Name = "JWT Authentication",
                    Description = "Enter JWT Bearer token **_only_**",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.Http,
                    Scheme = "bearer", // must be lower case
                    BearerFormat = "JWT",
                    Reference = new OpenApiReference
                    {
                        Id = JwtBearerDefaults.AuthenticationScheme,
                        Type = ReferenceType.SecurityScheme
                    }
                };
                c.AddSecurityDefinition(securityScheme.Reference.Id, securityScheme);
                c.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {securityScheme, new string[] { }}
                });

                // add Basic Authentication
                var basicSecurityScheme = new OpenApiSecurityScheme
                {
                    Type = SecuritySchemeType.Http,
                    Scheme = "basic",
                    Reference = new OpenApiReference { Id = "BasicAuth", Type = ReferenceType.SecurityScheme }
                };
                c.AddSecurityDefinition(basicSecurityScheme.Reference.Id, basicSecurityScheme);
                c.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {basicSecurityScheme, new string[] { }}
                });

                
            });

Zum Testen habe ich hier zwei Autorisierungs-Methoden: JWT und Basic.
Um meinen JWT Token zu bekommen, nutze ich meinen AuthController in Swagger. Wenn ich mich darüber anmelde, wird der Token leider nicht im Header mitgegeben. Bei Basic Auth wird der Basic string allerdings mitgegeben.
Mit der Dokumentation von Swagger UI kann ich leider überhaupt nichts anfangen.

Zusätzlich habe ich noch eine andere Frage:
All meine Web API Endpunkte sind nun mit einem Schloss versehen, obwohl nicht alle Endpunkte mit dem AuthorizeAttribute versehen sind. Wieso? Und wie kann ich nur jene, die auch eine Autorisierung benötigen, mit einem Schloss versehen?

Erstellt vor 4 Jahren

Habe über "Webverweis hinzufügen" die Dienst aus BC übernehmen können. Dies hat mir einige WSDL Dateien generier, allerdings kann Visual Studio die Klassen dafür nicht finden.
Bspw. habe ich eine "MitarbeiterPlan.wsdl" und der Webverweisname ist "SoapService".
Laut Blog-Post sollte ich nun den Service mit

SoapService.MitarbeiterPlan plan = new SoapService.MitarbeiterPlan() 

instanziieren und verwenden können. 🤔

Nur Probleme.. 😭

Erstellt vor 4 Jahren

Warum magst Du darauf setzen?

Mögen ganz und gar nicht. Ich mag SOAP nicht, erinnert mich immer an WCF und das mochte ich auch nicht.

Aber ich denke ich muss, weil ich eine Codeunit habe, die ich gerne per API anstoßen will und das leider nur mit SOAP funktioniert laut Microsoft:

Microsoft Web-Services

Wüsste sonst nicht, wie ich das ermöglichen könnte.

Erstellt vor 4 Jahren

Weiß jemand, ob man SOAP statt ODataV4 verwenden kann und ob es dafür schon Libraries gibt?

Erstellt vor 4 Jahren

Aber es ist halt auch nur ein Code Generator, der nicht zwangsläufig alle Anforderung abdecken kann, die Du haben willst - und er ist veraltet.

Also ich benutze hierfür die "OData Connected Service" Erweiterung, die, glaube ich, nicht veraltet ist, denn sie erstellt OData V4 Services, die wiederum Klassen aus dem "OData Client" Projekt verwenden. Beispielsweise kommt der automatisch erstellte Datenkontext (DataServiceContext) aus Namespace "Microsoft.OData.Client".

Gibt es eine Möglichkeit, auch in Visual Studio die genauen Exceptions anzuzeigen?

Nein, denn Visual Studio ist prinzipiell nur eine Entwicklungsumgebung. Wenn Dir der OData Client das nicht aufsammeln, dann bekommst Du natürlich auch nichts.

Die Frage habe ich missverständlich gestellt. Damit meinte ich eher, ob ich es mithilfe der Connected Services (OData) so gut hinbekommen kann wie der Web Debugger von Fiddler.

@Papst, @Abt
Das würde wahrscheinlich mit OData Lib gehen (habe ich gerade eben durch Abts Link gefunden), aber das ist mir zu viel Aufwand für das aktuelle Projekt. Ich bleibe bei Fiddler (wieso Dinge neu erfinden). Wäre aber für die Zukunft sicherlich ein Gedanke wert, alleine schon des Loggings wegen.