Nuestro team de trabajo ha pasado horas buscando para dar solución a tu búsqueda, te regalamos la respuesta por eso deseamos servirte de mucha apoyo.
Solución:
Nos encontramos con el mismo problema en nuestro proyecto. También quería agregar los parámetros del encabezado al sitio web de la interfaz de usuario de Swagger. Así es como lo hicimos:
1. Definir una clase OperationFilter
OperationFilters se ejecuta en cada operación de API cada vez que crea Swagger. Según su código, las operaciones se verificarán de acuerdo con sus filtros. En este ejemplo, hacemos que el parámetro de encabezado sea obligatorio en todas las operaciones, pero lo hacemos opcional en las operaciones que tienen el parámetro AllowAnonymous. attribute.
public class AddAuthorizationHeader : IOperationFilter
///
/// Adds an authorization header to the given operation in Swagger.
///
/// The Swashbuckle operation.
/// The Swashbuckle schema registry.
/// The Swashbuckle api description.
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
if (operation == null) return;
if (operation.parameters == null)
operation.parameters = new List();
var parameter = new Parameter
description = "The authorization token",
@in = "header",
name = "Authorization",
required = true,
type = "string"
;
if (apiDescription.ActionDescriptor.GetCustomAttributes().Any())
parameter.required = false;
operation.parameters.Add(parameter);
2. Dígale a Swagger que use este OperationFilter
En SwaggerConfig, solo agregue que el filtro de operación debe usarse de la siguiente manera:
c.OperationFilter();
¡Espero que esto te ayude!
Cree un nuevo filtro de operaciones que implemente IOperationFilter
.
public class AuthorizationHeaderOperationFilter : IOperationFilter
///
/// Adds an authorization header to the given operation in Swagger.
///
/// The Swashbuckle operation.
/// The Swashbuckle operation filter context.
public void Apply(Operation operation, OperationFilterContext context)
if (operation.Parameters == null)
operation.Parameters = new List();
var authorizeAttributes = context.ApiDescription
.ControllerAttributes()
.Union(context.ApiDescription.ActionAttributes())
.OfType();
var allowAnonymousAttributes = context.ApiDescription.ActionAttributes().OfType();
if (!authorizeAttributes.Any() && !allowAnonymousAttributes.Any())
return;
var parameter = new NonBodyParameter
Name = "Authorization",
In = "header",
Description = "The bearer token",
Required = true,
Type = "string"
;
operation.Parameters.Add(parameter);
Configura el servicio en tu Startup.cs
expediente.
services.ConfigureSwaggerGen(options =>
options.OperationFilter();
);
Podrías hacerlo de diferentes maneras dependiendo de cómo recolectes el Authorization
encabezado y si desea que el código maneje todo o si desea que el usuario pueda ingresar lo que sea Authorization
encabezado que quieren.
Cuando probé esto por primera vez, pude mostrar un Authorization
texto de encabezado en el área de campo de parámetro de cada punto final donde un usuario podría escribir un Authorization
encabezado pero eso no era lo que quería.
En mi situación, tuve que enviar una solicitud a la /token
punto final con la cookie del usuario para obtener una válida Authorization
simbólico. Así que hice una combinación de cosas para lograr esto.
Primero en SwaggerConfig.cs
yo descomentaba c.BasicAuth()
para obtener el esquema de autenticación básico en el esquema API y también inyecté un index.html
página donde inserté una solicitud AJAX para obtener el Authorization
token, utilizando la cookie del usuario (index.html
código que se muestra a continuación):
public static void Register()
System.Reflection.Assembly thisAssembly = typeof(SwaggerConfig).Assembly;
System.Web.Http.GlobalConfiguration.Configuration
.EnableSwagger(c =>
...
c.BasicAuth("basic").Description("Bearer Token Authentication");
...
)
.EnableSwaggerUi(c =>
...
c.CustomAsset("index", thisAssembly, "YourNamespace.index.html");
...
);
Entonces dirígete aquí para descargar el swashbuckle index.html
que personalizaremos para insertar un Authorization
encabezamiento.
A continuación, simplemente hago una llamada AJAX a mi /token
endpoint con una cookie válida, obtenga el Authorization
token, y dáselo a swagger para que lo use con window.swaggerUi.api.clientAuthorizations.add()
:
...
function log()
if ('console' in window)
console.log.apply(console, arguments);
$.ajax(
url: url + 'token'
, type: 'POST'
, data: 'grant_type': 'CustomCookie'
, contentType: 'application/x-www-form-urlencoded'
, async: true
, timeout: 60000
, cache: false
, success: function(response)
console.log('Token: ' + response['token_type'] + ' ' + response['access_token']);
window.swaggerUi.api.clientAuthorizations.add("key", new SwaggerClient.ApiKeyAuthorization("Authorization", response['token_type'] + ' ' + response['access_token'], "header"));
, error: function(request, status, error)
console.log('Status: ' + status + '. Error: ' + error + '.');
);
Eliminé algunas cosas de la llamada AJAX para hacerlo más simple y, obviamente, su implementación probablemente será diferente dependiendo de cómo recopile su Authorization
token y esas cosas, pero eso te da una idea. Si tiene algún problema o pregunta específica, hágamelo saber.
*Editar: no me di cuenta de que realmente quería que el usuario escribiera su Authorization
encabezamiento. En ese caso es muy fácil. Usé esta publicación. Simplemente creó la siguiente clase para hacer el trabajo:
public class AddRequiredHeaderParameter : IOperationFilter
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
if (operation.parameters == null)
operation.parameters = new List();
operation.parameters.Add(new Parameter
name = "Foo-Header",
@in = "header",
type = "string",
required = true
);
Luego agregué la clase a mi SwaggerConfig
al igual que:
...
c.OperationFilter();
...
Agradecemos que desees corroborar nuestra misión ejecutando un comentario y dejando una puntuación te damos las gracias.