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.

¿Cómo configurar varias políticas de autorización global en un controlador de ASP.Net Core por ruta?

Trabajando con una API de ASP.Net Core. Existe una ruta (api/) para la aplicación regular, y otra (admin/) para las API de administración. ¿Hay alguna forma de establecer diferentes políticas globales basadas en la URL?

Este artículo Setting global authorization policies using the DefaultPolicy and the FallbackPolicy in ASP.NET Core 3.x habla sobre cómo establecer autorizaciones globales en diferentes partes de la aplicación (MapRazorPages, MapHealthChecks, etc).

La función MapHealthChecks tiene un parámetro para las rutas a las que se aplicará la política. MapControllers() no recibe ningún parámetro. ¿Es posible hacer lo mismo en un controlador?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible establecer diferentes políticas globales basadas en la URL en una API de ASP.Net Core utilizando políticas y middleware. El artículo mencionado anteriormente, “>Estableciendo políticas de autorización globales utilizando DefaultPolicy y FallbackPolicy en ASP.NET Core 3.x, ofrece orientación sobre cómo lograr esto.

    Para establecer una política basada en una URL específica, puedes utilizar middleware para inspeccionar la URL y luego aplicar la política correspondiente en función de la URL. Por ejemplo, puedes crear un componente de middleware que inspeccione la URL y aplique la política apropiada. Aquí tienes un ejemplo de cómo utilizar middleware para aplicar una política en función de una URL:

    public class PolicyMiddleware
    {
        private readonly RequestDelegate _next;
    
        public PolicyMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task Invoke(HttpContext context, IAuthorizationService authorizationService)
        {
            if (context.Request.Path.StartsWithSegments("/api"))
            {
                var policy = await authorizationService
                    .AuthorizeAsync(context.User, "ApiPolicy");
                if (!policy.Succeeded)
                {
                    context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                    return;
                }
            }
            else if (context.Request.Path.StartsWithSegments("/admin"))
            {
                var policy = await authorizationService
                    .AuthorizeAsync(context.User, "AdminPolicy");
                if (!policy.Succeeded)
                {
                    context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                    return;
                }
            }
    
            await _next.Invoke(context);
        }
    }
    

    En este ejemplo, el middleware inspecciona la URL de la solicitud y aplica la política correspondiente (“ApiPolicy” o “AdminPolicy”) según la URL. Si la política no se cumple, el middleware devuelve un código de estado 401 No autorizado. Si la política se cumple, el middleware continúa con el siguiente componente en la canalización (en este caso, los controladores).

    Para utilizar este middleware, puedes agregarlo a la canalización de tu aplicación en el método Configure de tu clase Startup:

    app.UseMiddleware<policymiddleware>();
    

    Con este middleware en su lugar, ahora puedes establecer tus requisitos de política para “ApiPolicy” y “AdminPolicy” en el método ConfigureServices de tu clase Startup:

    services.AddAuthorization(options =>
    {
        options.AddPolicy("ApiPolicy", policy =>
            policy.RequireClaim("ApiAccess"));
        options.AddPolicy("AdminPolicy", policy =>
            policy.RequireRole("Admin"));
    });
    

    Esto establecerá las políticas de autorización globales “ApiPolicy” y “AdminPolicy”, que se aplicarán según la URL solicitada.

    En general, aunque MapControllers no permite la aplicación de políticas a nivel de controlador, se pueden implementar soluciones de middleware en la canalización de la aplicación y se pueden aplicar políticas según la URL solicitada.

Comments are closed.