it-swarm.com.de

Trägermarker in Swashbuckle aktivieren (Swagger-Dokument)

Ich habe eine asp.net webapi-Anwendung erstellt, die Individual Account Security verwendet, sodass das Trägertoken standardmäßig aktiviert ist. Es funktioniert gut, damit ich sie problemlos bei Postman testen kann.

Hier kommt die Frage, wenn ich versuche, die Swagger-Benutzeroberfläche von Swashbuckle zu integrieren. Ich habe das Swashbuckle installiert von:

Install-Package Swashbuckle

Dann ändern Sie die SwaggerConfig.cs:

GlobalConfiguration.Configuration
    .EnableSwagger(c =>
    {
        c.ApiKey("Token")
            .Description("Filling bearer token here")
            .Name("Authorization")
            .In("header");
    }
    .EnableSwaggerUi(c =>
    {
        c.EnableApiKeySupport("Authorization", "header");
    };

Starten Sie meine Bewerbung und füllen Sie das Trägertoken aus:

 enter image description here

Es funktioniert jedoch nicht, wenn ich die api-Anfrage starte, für die eine Autorisierung erforderlich ist. Hier ist der Screenshot:

 enter image description here

Das Trägertoken wird in der Kopfzeile zu Authorization hinzugefügt. Ich habe aber immer noch den Fehler 401 erhalten. Ich frage mich, ob der Token verschlüsselt ist (der Leerzeichen wird durch% 20 ersetzt). Irgendeine Idee? Vielen Dank.

Ich frage mich übrigens, wie ich das / token auch in mein Swagger-Dokument einfügen kann, damit ich das Token in der Swagger-Benutzeroberfläche erhalten kann.

29
Bagusflyer

Aktualisieren

Das unten beschriebene Problem wurde jetzt in Swashbuckle v5.5.0 behoben.

Problem

Ich bin gerade auf die gleiche Ausgabe gestoßen. Ich denke, die Hauptursache ist diese Zeile in Swashbuckles Quellcode :

var key = encodeURIComponent($('#input_apiKey')[0].value);

Hier wird der Wert aus dem HTML-Eingabefeld durch die URL-Kodierung durchlaufen und der Platz in %20 umgewandelt. Ich plane, eine Ausgabe im Swashbuckle-Repo auf GitHub zu eröffnen.

Workaround

Bis zur Behebung dieses Problems besteht eine Problemumgehung, die auf dem Ersetzen der obigen Zeile mithilfe einer in die Swagger-Benutzeroberfläche eingefügten Javascript-Datei basiert:

  1. Erstellen Sie in dem Projekt, in dem Swashbuckle installiert ist, einen neuen Ordner und nennen Sie es "Swagger".

  2. Erstellen Sie in dem neuen Ordner eine neue Javascript-Datei mit dem Namen "SwaggerUiCustomization.js" und fügen Sie dieses Skript ein: 

    (function () {
        function addApiKeyAuthorization() {
            var key = $('#input_apiKey')[0].value;
            if (key && key.trim() != "") {
                var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization(swashbuckleConfig.apiKeyName, key, swashbuckleConfig.apiKeyIn);
                window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
                log("added key " + key);
            }
        }
        $('#input_apiKey').change(addApiKeyAuthorization);
    })();
    
  3. Wählen Sie im Projektmappen-Explorer die Datei aus und drücken Sie Alt + Eingabetaste, um deren Eigenschaften zu bearbeiten. Ändern Sie im Fenster Properties die Build-Aktion der Datei in Embedded Resource

  4. Fügen Sie in Ihrer SwaggerConfig.cs-Datei die folgende Zeile innerhalb des EnableSwaggerUi()-Codeblocks hinzu: c.InjectJavaScript(thisAssembly, "<Project_Default_Namespace>.Swagger.SwaggerUiCustomization.js");
    Stellen Sie sicher, dass Sie <Project_Default_Namespace> durch den Standardnamespace Ihres Projekts ersetzen. 

  5. Führen Sie Ihr Projekt aus und geben Sie "Bearer" in das Textfeld ein. Wenn Sie eine Controller-Aktion aufrufen, sollten Sie genau denselben Wert erhalten - mit einem Leerzeichen anstelle von %20% - auf der Serverseite.

18
urig

Hinweis: In diesem Beispiel werden Json-Web-Token verwendet.

Ihr Code kann so eingerichtet werden, dass "Träger" in der Autorisierungszeichenfolge nicht erforderlich ist.

Code im WebApi-Projekt zum Abrufen des Tokens (siehe token = ... im folgenden Codesegment):

private static bool TryRetrieveToken(HttpRequestMessage request, out string token)
    {
        token = null;
        IEnumerable<string> authzHeaders;
        if (!request.Headers.TryGetValues("Authorization", out authzHeaders) || authzHeaders.Count() > 1)
        {
            return false;
        }
        var bearerToken = authzHeaders.ElementAt(0);
        token = bearerToken.StartsWith("Bearer ") ? bearerToken.Substring(7) : bearerToken;
        return true;
    }

Swagger ApiKey:

c.ApiKey("Authorization")
                        .Description("Filling bearer token here")
                        .Name("Bearer")
                        .In("header");

Swagger Enable ApiKey-Unterstützung:

c.EnableApiKeySupport("Authorization", "header");

Einfügen eines Tokens in ein Api_Key-Formularelement in der Swagger-Benutzeroberfläche:  enter image description here

Wie es im Anforderungsheader in Swagger aussieht:  enter image description here

2