Laden...

Swagger UI: Mit Basic anmelden, aber JWT für Autorisierung nutzen

Erstellt von Davaaron vor 3 Jahren Letzter Beitrag vor 3 Jahren 677 Views
D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren
Swagger UI: Mit Basic anmelden, aber JWT für Autorisierung nutzen

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?

16.842 Beiträge seit 2008
vor 3 Jahren

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.

Das ist die Authentifizierung: wer bist Du - oder in diesem Fall "ich möchte Deinen Namen kennen, damit Du mit mir reden darfst".
Die Authorisierung wäre: was darfst Du.

Du willst also nur, dass angemeldete User die API anfragen darf; oder auch zusätzlich noch Regeln mitgeben, zB welche Rolle der User hat?

der den JWT inklusive Refresh-Token zurückgibt

Was genau hast Du? JWT ist der Aufbau eines Tokens; und ein Refresh-Token ist ein JWT Token.
Meinst Du id_token und refresh_token?
Arbeitest Du mit OpenId und OAuth2 oder hast Du was eigenes?

Um meinen JWT Token zu bekommen, nutze ich meinen AuthController in Swagger.

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

Fürs Protokoll: Du verwendest SwashBuckle, richtig?

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 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?