it-swarm.com.de

Web Api So fügen Sie einen Header-Parameter für alle API in Swagger hinzu

Ich suchte nach Möglichkeiten, um einen Anforderungsheader-Parameter hinzuzufügen, der automatisch zu jeder Methode in meinem web-api hinzugefügt würde, aber ich konnte keine klare finden. 

Bei der Suche habe ich festgestellt, dass die Methode OperationFilter() etwas dagegen tun muss. 

9
user2245758

Ja, Sie können dies durch das Erben von IOperationFilter tun.

Sie finden die Antwort auf GitHub hier: AddRequiredHeaderParameter

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;

public class AddRequiredHeaderParameter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        if (operation.Parameters == null)
            operation.Parameters = new List<IParameter>();

        operation.Parameters.Add(new NonBodyParameter
            {
                Name = "X-User-Token",
                In = "header",
                Type = "string",
                Required = false
            });
    }
}

Dann gehen Sie zu Ihrer SwaggerConfig.cs-Datei und fügen Folgendes in den Abschnitt AddSwaggerGen ein: 

c.OperationFilter<AddRequiredHeaderParameter>();

Wiederaufbau und genießen.

16
Ramy Mohamed

Eine andere Möglichkeit, benutzerdefinierte Header hinzuzufügen, besteht darin, der Controller-Aktion Parameter hinzuzufügen.
Im folgenden Beispiel wird x-test Parameter zur Benutzeroberfläche:

[HttpPost]
public IActionResult Test([FromHeader(Name="x-test")][Required] string requiredHeader)
{
    return Ok();
}

enter image description here

7
Pavel Agarkov

Ich musste das etwas anders machen, nicht sicher warum. So habe ich einen Header-Wert hinzugefügt:

Dies wurde meiner Swagger-Konfiguration hinzugefügt:

    c.OperationFilter<AddRequiredHeaderParameter>();

Und das war die Klasse:

    public class AddRequiredHeaderParameter : IOperationFilter
    {
        public void Apply(Operation operation, OperationFilterContext context)
        {
            operation.Parameters.Add(new NonBodyParameter
            {
                Name = "X-MYHEADER",
                In = "header",
                Type = "string",
                Required = false
            });
        }
    }
3
Mr Giggles

Was der Benutzer "G T" schrieb, ist korrekt, aber es funktioniert nicht mit Swagger 5. Wir haben einige neue Änderungen: Von: "Operation" zu: "OpenApiOperation". Von: "IParameter" bis: "OpenApiParameter". Von: "NonBodyParameter" bis: "OpenApiParameter". Und das wichtigste ist von: "Type =" string "" bis: "Schema = new OpenApiSchema {Type =" String "}".

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace MyAPI
{
    public class AuthorizationHeaderParameterOperationFilter: IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var filterPipeline = context.ApiDescription.ActionDescriptor.FilterDescriptors;
            var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is AuthorizeFilter);
            var allowAnonymous = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter);

            if (isAuthorized && !allowAnonymous)
            {
                if (operation.Parameters == null)
                    operation.Parameters = new List<OpenApiParameter>();

                operation.Parameters.Add(new OpenApiParameter 
                {
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Description = "access token",
                    Required = true,
                    Schema = new OpenApiSchema
                    {
                        Type = "String",
                        Default = new OpenApiString("Bearer ")
                    }
                });
            }
        }
    }
}

Und in Startup => ConfigureServices (

c.OperationFilter<AuthorizationHeaderParameterOperationFilter>();
2
Wille Esteche

Möglicherweise verfügen Sie auch über eine Basismodellklasse und verwenden das Attribut [FromHeader] für Eigenschaften, die in benutzerdefinierten Headern gesendet werden sollen. Etwas wie das:

public class AuthenticatedRequest
{
    [FromHeader(Name = "User-Identity")]
    public string UserIdentity { get; set; }
}

Zumindest funktioniert es gut für ASP.NET Core 2.1 und Swashbuckle.AspNetCore 2.5.0.

0

Für Asp .Net MVC 5 können Sie verwenden.
Befolgen Sie die Anforderungen in der Swagger-Konfigurationsdatei.

private class AddAuthorizationHeaderParameter: IOperationFilter   // as a nested class in script config file.
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters == null)
            operation.parameters = new List<Parameter>();

        operation.parameters.Add(new Parameter
        {
            name = "Authorization",
            @in = "header",
            type = "string",
            required = true
        });
    }
}

c.OperationFilter<AddAuthorizationHeaderParameter>(); // finally add this line in .EnableSwagger

Sie können auch eine beliebige Anzahl von Headern für die Header-Implementierung in Swagger hinzufügen.

0
Rajat Nigam