es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna manera de agregar metadatos a todos los puntos finales GET en ASP.NET Core?

En la siguiente declaración, AsBffApiEndpoint() añade un atributo a todos los endpoints. Luego hay un middleware que busca específicamente ese atributo y, si está presente, verifica que haya un encabezado antifalsificación.

endpoints.MapControllers().RequireAuthorization().AsBffApiEndpoint();

Necesito poder evitar esa verificación en todos los endpoints de tipo GET. Lo más importante es que esta es una biblioteca de terceros, por lo tanto, no tengo control sobre la implementación.

He intentado muchas cosas sin éxito. El último intento fue agregar un middleware personalizado app.Use(...) y, si el atributo estaba presente, eliminarlo. Sin embargo, eso no es posible ya que la lista de metadatos es de solo lectura. Entonces, mi última esperanza es encontrar una manera de agregar el mismo atributo a todos los endpoints de tipo GET con un indicador false que ignore la verificación. Es decir, todo lo que hace AsBffApiEndpoint() es decorar un endpoint con el atributo [BffApi]. Este atributo ignora los encabezados de antifalsificación si se usa de esta manera [BffApi(false)]. Sé que la solución es un poco chapucera porque terminaré con algo como esto.

[BffApi]
[BffApi(false)]
//definición del endpoint aquí

La buena noticia es que obtienen los metadatos del endpoint ordenados endpoint.Metadata.GetOrderedMetadata<BffApiAttribute>(). Es decir, siempre que [BffApi(false)] tenga prioridad en la lista, debería funcionar bien.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para evadir la verificación de falsificación en todos los puntos finales GET

    Si necesitas evadir la verificación de falsificación en todos los puntos finales GET, pero no tienes control sobre la biblioteca de terceros (método AsBffApiEndpoint()), puedes seguir la siguiente solución:

    1. Crea un middleware personalizado:
      public class BypassAntiforgeryOnGetMiddleware
      {
         private readonly RequestDelegate _next;
      
         public BypassAntiforgeryOnGetMiddleware(RequestDelegate next)
         {
             _next = next;
         }
      
         public async Task Invoke(HttpContext context)
         {
             var endpoint = context.GetEndpoint();
             var isGetRequest = context.Request.Method == "GET";
      
             if (isGetRequest && endpoint?.Metadata?.GetMetadata<bffapiattribute>() != null)
             {
                 endpoint.Metadata.Remove(endpoint.Metadata.GetMetadata<bffapiattribute>());
                 endpoint.Metadata.Add(new BffApiAttribute(false));
             }
      
             await _next(context);
         }
      }
      
    2. Registra el middleware en el método Configure de tu clase Startup, antes del método UseRouting:
      app.UseMiddleware<bypassantiforgeryongetmiddleware>();
      app.UseRouting();
      
    3. El middleware verificará si la solicitud entrante es una solicitud GET y si tiene el atributo [BffApi] (añadido por el método AsBffApiEndpoint()). Si ambas condiciones se cumplen, eliminará el atributo que requiere la prevención de falsificación y añadirá uno nuevo con el parámetro false, el cual ignora el encabezado de prevención de falsificación.
    4. Asegúrate de que [BffApi(false)] tenga prioridad en la lista de Metadatos. El atributo original [BffApi] debe añadirse primero, seguido del atributo [BffApi(false)]. De esta manera, si ambos atributos se encuentran en un punto final, el parámetro false tendrá efecto.

      [BffApi]
      [BffApi(false)]
      // definición del punto final aquí
      

    Esta solución proporciona una forma de evadir la verificación de falsificación en todas las solicitudes GET cuando se utiliza una biblioteca de terceros sobre la cual no tienes control. Sin embargo, ten en cuenta que evadir la verificación de falsificación puede representar un riesgo de seguridad y sólo debe hacerse después de una cuidadosa consideración.

Comments are closed.