¿Cómo leer los roles de la base de datos en lugar de confiar en la web en la autorización basada en roles asp.net?

Trabajamos con un viejo sistema diseñado que es Role-Based y lee roles de los usuarios desde webconfig como sigue:


  

         
             
                 
               
          

Estoy buscando una manera de eliminar funciones desde webconfig y tenerlos en mi base de datos. Sé que está relacionado con IPrincipal y IsInRole método, pero después de horas de googling no podría envolverme la cabeza alrededor de eso.

Dónde exactamente webconfig Los papeles están ligados al contexto de seguridad y ¿cómo debería cambiarlo?

Base en el artículo de Microsoft:

Al utilizar la autorización URL basada en el papel, el RolePrincipal El método IsInRole será llamado en cada solicitud a una página que sea protegidos por las reglas de autorización de URL basadas en el papel

He implementado IsInRole y su búsqueda de roles en objeto de consulta de bases de datos y trabajo bien, pero cuando se eliminan los roles Web Config, el login de usuario está fallado.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por pixelpioneerbbb5


2 Respuestas:

  • Para lograr leer los roles de la base de datos en lugar de confiar en los roles definidos en el archivo web.config en autorización basada en roles en ASP.NET, puedes seguir los siguientes pasos:

    • En primer lugar, necesitas crear una tabla en tu base de datos que almacene los roles de los usuarios. Esta tabla puede tener una estructura similar a la siguiente:

    sql
       CREATE TABLE Roles (
           RoleId INT PRIMARY KEY,
           RoleName NVARCHAR(50)
       );
       

    • Luego, necesitas crear una tabla de asignación que relacione los roles con los usuarios. Por ejemplo:

    sql
       CREATE TABLE UserRoles (
           UserId INT,
           RoleId INT,
           CONSTRAINT PKUserRoles PRIMARY KEY (UserId, RoleId),
           CONSTRAINT FKUserRolesUsers FOREIGN KEY (UserId) REFERENCES Users(Id),
           CONSTRAINT FKUserRoles_Roles FOREIGN KEY (RoleId) REFERENCES Roles(RoleId)
       );
       

    • En tu aplicación ASP.NET, necesitarás crear una clase personalizada que implemente la interfaz `IPrincipal`. En esta clase, puedes implementar la lógica para verificar si un usuario pertenece a cierto rol consultando la base de datos en lugar de depender de los roles definidos en el `web.config`.
    • En tu clase que maneja la autenticación de usuarios (por ejemplo, durante el login), después de autenticar al usuario, deberás configurar el objeto `Thread.CurrentPrincipal` para que sea una instancia de tu clase personalizada que implementa `IPrincipal`.
    • Ahora, en tus páginas protegidas, en lugar de especificar los roles directamente en el `web.config`, puedes realizar la verificación de roles en cada página o en un filtro de autorización personalizado, consultando la base de datos a través de tu clase personalizada que implementa `IPrincipal`.

    Aquí puedes encontrar un ejemplo simplificado de cómo implementar la lógica de autorización basada en roles con roles almacenados en la base de datos en ASP.NET:

    csharp
    public class CustomPrincipal : IPrincipal
    {
        public IIdentity Identity { get; private set; }
        private List _roles;
    
        public CustomPrincipal(IIdentity identity)
        {
            Identity = identity;
            // obtener roles del usuario desde la base de datos y asignarlos a _roles
        }
    
        public bool IsInRole(string role)
        {
            // Verificar si el usuario pertenece al rol consultando en la base de datos
            return _roles.Contains(role);
        }
    }
    

    En resumen, al implementar estas sugerencias, podrás dejar de depender de los roles definidos en el archivo web.config y gestionar los roles de los usuarios directamente desde tu base de datos en ASP.NET. Si tienes alguna pregunta adicional o necesitas más ayuda, ¡no dudes en decírmelo!

    Respondida el Dec 18, 2020 a las 06:29 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para leer los roles desde la base de datos en lugar de depender del archivo webconfig para la autorización basada en roles en ASP.NET, puedes seguir estos pasos:

    • Crea una tabla de roles en tu base de datos:
    sql
    CREATE TABLE Roles (
      Id INT NOT NULL IDENTITY PRIMARY KEY,
      RoleName VARCHAR(255) NOT NULL
    );
    
    • Crea una tabla de usuarios y roles:
    sql
    CREATE TABLE UserRoles (
      UserId INT NOT NULL,
      RoleId INT NOT NULL,
      PRIMARY KEY (UserId, RoleId),
      FOREIGN KEY (UserId) REFERENCES Users(Id),
      FOREIGN KEY (RoleId) REFERENCES Roles(Id)
    );
    
    • Actualiza tu clase de usuario para implementar la interfaz `IPrincipal`:
    csharp
    public class User : IPrincipal
    {
        public int Id { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
    
        public IIdentity Identity { get; }
        public bool IsInRole(string role)
        {
            // Consulta la base de datos para comprobar si el usuario está en el rol especificado
            using (var context = new MyDbContext())
            {
                return context.UserRoles.Any(ur => ur.UserId == Id && ur.Role.RoleName == role);
            }
        }
    }
    
    • Actualiza tu archivo `webconfig` para utilizar la clase de usuario personalizada:
    xml
    
      
    
    
      
    
    
    
      
    
    
    • Crea un proveedor de roles personalizado que recupere los roles de la base de datos:
    csharp
    public class MyRoleProvider : RoleProvider
    {
        public override bool IsUserInRole(string username, string roleName)
        {
            // Consulta la base de datos para comprobar si el usuario está en el rol especificado
            using (var context = new MyDbContext())
            {
                var user = context.Users.FirstOrDefault(u => u.Username == username);
                if (user != null)
                {
                    return context.UserRoles.Any(ur => ur.UserId == user.Id && ur.Role.RoleName == roleName);
                }
            }
    
            return false;
        }
    }
    
    • Registra tu proveedor de roles en el archivo `webconfig`:
    xml
    
      
    
    

    Ten en cuenta que este es un ejemplo básico y puede que necesites personalizarlo en función de los requisitos específicos de tu aplicación.

    Respondida el Dec 18, 2020 a las 06:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0