Saltar al contenido

¿Cómo crear roles en ASP.NET Core y asignarlos a los usuarios?

Nuestro grupo redactor ha estado horas buscando la solución a tus dudas, te ofrecemos la solución por eso nuestro deseo es serte de gran ayuda.

Solución:

Mi comentario fue eliminado porque proporcioné un enlace a una pregunta similar que respondí aquí. Ergo, la responderé de manera más descriptiva esta vez. Aquí va.

Puede hacer esto fácilmente creando un CreateRoles método en tu startup clase. Esto ayuda a verificar si se crean los roles y crea los roles si no lo son; en el inicio de la aplicación. Al igual que.

private async Task CreateRoles(IServiceProvider serviceProvider)
    
        //initializing custom roles 
        var RoleManager = serviceProvider.GetRequiredService>();
        var UserManager = serviceProvider.GetRequiredService>();
        string[] roleNames =  "Admin", "Manager", "Member" ;
        IdentityResult roleResult;

        foreach (var roleName in roleNames)
        
            var roleExist = await RoleManager.RoleExistsAsync(roleName);
            if (!roleExist)
            
                //create the roles and seed them to the database: Question 1
                roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
            
        

        //Here you could create a super user who will maintain the web app
        var poweruser = new ApplicationUser
        

            UserName = Configuration["AppSettings:UserName"],
            Email = Configuration["AppSettings:UserEmail"],
        ;
    //Ensure you have these values in your appsettings.json file
        string userPWD = Configuration["AppSettings:UserPassword"];
        var _user = await UserManager.FindByEmailAsync(Configuration["AppSettings:AdminUserEmail"]);

       if(_user == null)
       
            var createPowerUser = await UserManager.CreateAsync(poweruser, userPWD);
            if (createPowerUser.Succeeded)
            
                //here we tie the new user to the role
                await UserManager.AddToRoleAsync(poweruser, "Admin");

            
       
    

y luego podrías llamar al CreateRoles(serviceProvider).Wait(); método del Configure en la clase Startup. asegúrate de tener IServiceProvider como parámetro en el Configure clase.

Uso de la autorización basada en roles en un controlador para filtrar el acceso de los usuarios: Pregunta 2

Puedes hacer esto fácilmente, así.

[Authorize(Roles="Manager")]
public class ManageController : Controller

   //....

También puede utilizar la autorización basada en roles en el método de acción como tal. Asigne múltiples roles, si lo desea

[Authorize(Roles="Admin, Manager")]
public IActionResult Index()

/*
 .....
 */ 

Si bien esto funciona bien, para una práctica mucho mejor, es posible que desee leer sobre el uso de comprobaciones de roles basadas en políticas. Puede encontrarlo en la documentación principal de ASP.NET aquí, o en este artículo que escribí al respecto aquí

He creado una acción en el Accounts controlador que llama a una función para crear los roles y asignar el Admin rol para el usuario predeterminado. (Probablemente debería eliminar el usuario predeterminado en producción):

    private async Task CreateRolesandUsers()
      
        bool x = await _roleManager.RoleExistsAsync("Admin");
        if (!x)
        
            // first we create Admin rool    
            var role = new IdentityRole();
            role.Name = "Admin";
            await _roleManager.CreateAsync(role);

            //Here we create a Admin super user who will maintain the website                   

            var user = new ApplicationUser();
            user.UserName = "default";
            user.Email = "[email protected]";

            string userPWD = "somepassword";

            IdentityResult chkUser = await _userManager.CreateAsync(user, userPWD);

            //Add default User to Role Admin    
            if (chkUser.Succeeded)
            
                var result1 = await _userManager.AddToRoleAsync(user, "Admin");
            
        

        // creating Creating Manager role     
        x = await _roleManager.RoleExistsAsync("Manager");
        if (!x)
        
            var role = new IdentityRole();
            role.Name = "Manager";
            await _roleManager.CreateAsync(role);
        

        // creating Creating Employee role     
        x = await _roleManager.RoleExistsAsync("Employee");
        if (!x)
        
            var role = new IdentityRole();
            role.Name = "Employee";
            await _roleManager.CreateAsync(role);
        
  

Después, podría crear un controlador para administrar roles para los usuarios.

La respuesta de Temi es casi correcta, pero no se puede llamar a una función asincrónica desde una función no asincrónica como sugiere. Lo que debe hacer es realizar llamadas asincrónicas en una función sincrónica como esta:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
    
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
            app.UseBrowserLink();
        
        else
        
            app.UseExceptionHandler("/Home/Error");
        

        app.UseStaticFiles();

        app.UseIdentity();

        // Add external authentication middleware below. To configure them please see https://go.microsoft.com/fwlink/?LinkID=532715

        app.UseMvc(routes =>
        
            routes.MapRoute(
                name: "default",
                template: "controller=Home/action=Index/id?");
        );

        CreateRoles(serviceProvider);

    

    private void CreateRoles(IServiceProvider serviceProvider)
    

        var roleManager = serviceProvider.GetRequiredService>();
        var userManager = serviceProvider.GetRequiredService>();
        Task roleResult;
        string email = "[email protected]";

        //Check that there is an Administrator role and create if not
        Task hasAdminRole = roleManager.RoleExistsAsync("Administrator");
        hasAdminRole.Wait();

        if (!hasAdminRole.Result)
        
            roleResult = roleManager.CreateAsync(new IdentityRole("Administrator"));
            roleResult.Wait();
        

        //Check if the admin user exists and create it if not
        //Add to the Administrator role

        Task testUser = userManager.FindByEmailAsync(email);
        testUser.Wait();

        if (testUser.Result == null)
        
            ApplicationUser administrator = new ApplicationUser();
            administrator.Email = email;
            administrator.UserName = email;

            Task newUser = userManager.CreateAsync(administrator, "[email protected]!");
            newUser.Wait();

            if (newUser.Result.Succeeded)
            
                Task newUserRole = userManager.AddToRoleAsync(administrator, "Administrator");
                newUserRole.Wait();
            
        

    

los key a esto está el uso de la clase Task <> y obligar al sistema a esperar de una manera ligeramente diferente de forma sincrónica.

Te invitamos a añadir valor a nuestro contenido informacional tributando tu veteranía en las reseñas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *