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.

.NET Core: omitir o desactivar [Authorize(Roles=””)] durante el desarrollo local.

Tengo el siguiente código para evitar agregar autenticación durante el desarrollo local, estoy usando Azure AD y .NET Core.

Sin embargo, como mi controlador está protegido por el atributo Authorize, ¿cómo puedo omitir el atributo Authorize dentro del controlador durante el desarrollo local?

En .NET Framework tengo el siguiente código para anular el atributo Authorize:

¿Cuál es el código equivalente para .NET Core? ¿O hay alguna otra forma de anular el atributo Authorize en la clase Startup.cs?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En .NET Core, se puede crear un filtro de autorización personalizado para anular el atributo Authorize. Aquí hay un ejemplo:

    public class MyAuthorizeAttribute : AuthorizeAttribute
    {
    #if DEBUG
        public override void OnAuthorization(AuthorizationFilterContext context)
        {
            // Permitir el acceso anónimo durante el desarrollo local
            if (context.HttpContext.Request.Host.Host.ToLower() == "localhost")
            {
                return;
            }
    
            base.OnAuthorization(context);
        }
    #endif
    }
    

    Luego, en su controlador, puede utilizar MyAuthorizeAttribute en lugar de AuthorizeAttribute:

    [MyAuthorize(Roles = "Comprador")]
    public class ProductController : ApiBaseController
    {
    }
    

    Alternativamente, también puede configurar la política de autorización globalmente en el archivo Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));
    
        services.AddAuthorization(options =>
        {
            options.AddPolicy("MyPolicy", policy =>
            {
    #if DEBUG
                policy.RequireAssertion(context => 
                    context.Request.Host.Host.ToLower() == "localhost" || 
                    context.User.IsInRole("Comprador"));
    #else
                policy.RequireRole("Comprador");
    #endif
          });
        });
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseAuthentication();
    
        app.UseAuthorization();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers()
                .RequireAuthorization("MyPolicy");
        });
    }
    

    Esto requerirá el rol Comprador para todos los puntos finales de forma predeterminada, excepto durante el desarrollo local, donde permitirá el acceso anónimo.

Comments are closed.