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.
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.
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();
}
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
});
}
}
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>();
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.
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.