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.

¿Cuál es la mejor manera de mover las políticas de autorización de .NET 6 CORE fuera de program.cs para tener un program.cs limpio?

Tengo muchas Políticas de Autorización en mi proyecto .NET 6 CORE. En este momento, mi archivo program.cs (.NET 6 – No tiene startup.cs) está lleno de muchas políticas. ¿Hay alguna manera de limpiar el archivo program.cs y mover todo el código de las políticas a una clase o archivo diferente en .NET CORE 6?

Por favor, avíseme si se requieren más detalles adicionales.

Program.cs

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("SuperAdminPolicy", policy => policy.RequireRole("Super Administrator"));

    options.AddPolicy("DashboardPolicy", policy => policy.RequireAssertion(context =>
            context.User.IsInRole("Super Administrator") ||
            context.User.HasClaim(claim => claim.Type == "Dashboard" && claim.Value == "true")));

    options.AddPolicy("CreateRolePolicy", policy => policy.RequireAssertion(context =>
        context.User.IsInRole("Super Administrator") ||
        context.User.HasClaim(claim => claim.Type == "Create Role" && claim.Value == "true")));

    // ... Y muchas más políticas como esta

    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

Encontré muchos artículos sobre cómo hacer esto en versiones anteriores de .NET Core. No estoy seguro de cómo hacerlo en .NET 6 Core. Según el comentario a continuación, los métodos de extensión parecen prometedores. Pero .NET 6 tiene un archivo program.cs muy simple, hay diferencias clave en la implementación.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, en .NET 6, todavía puedes mover tu código de políticas de autorización a una clase o archivo separado para mantener limpio tu archivo Program.cs utilizando métodos de extensión. Puedes crear una nueva clase estática y definir métodos de extensión para IServiceCollection para encapsular la lógica de tus políticas de autorización.

    Aquí tienes un ejemplo de cómo puedes mover tu código de políticas de autorización a una clase separada AuthorizationPolicyExtensions:

    using Microsoft.AspNetCore.Authorization;
    using Microsoft.Extensions.DependencyInjection;
    
    public static class AuthorizationPolicyExtensions 
    {
        public static void AddCustomPolicies(this IServiceCollection services)
        {
            services.AddAuthorization(options =>
            {
                options.AddPolicy("SuperAdminPolicy", policy => 
                    policy.RequireRole("Super Administrator"));
    
                options.AddPolicy("DashboardPolicy", policy => 
                    policy.RequireAssertion(context =>
                        context.User.IsInRole("Super Administrator") ||
                        context.User.HasClaim(claim => claim.Type=="Dashboard" && claim.Value=="true")));
    
                options.AddPolicy("CreateRolePolicy", policy => 
                    policy.RequireAssertion(context =>
                        context.User.IsInRole("Super Administrator") ||
                        context.User.HasClaim(claim => claim.Type == "Create Role" && claim.Value == "true")));
    
                // ... muchas más políticas como esta
    
                options.FallbackPolicy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
            });
        }
    }
    

    Y luego llama a este método desde tu archivo Program.cs:

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddCustomPolicies(); // reemplaza la llamada al método AddAuthorization
    
    var app = builder.Build();
    
    // ...
    

    De esta manera, puedes mantener limpio y organizado tu archivo Program.cs.

Comments are closed.