none
Seguridad - Restringir que usuario escriba URL de forma manual y tenga acceso a webforms que no le corresponden RRS feed

  • Pregunta

  • Hola espero me puedan ayudar ya que tengo problemas con el código al momento de publicar en IIS de antemano gracias.

    Tengo una aplicación en asp.net webforms donde restrinjo al usuario a que pueda acceder a formularios o paginas que no le corresponden, esto lo realizo en la pagina maestra.

    En mi pagina maestra tengo este código:

     System.Security.Principal.WindowsIdentity usuario = System.Security.Principal.WindowsIdentity.GetCurrent();
    
     Menu = t.Mostrar_Menu(usuario.Name);

    Al ejecutarlo tengo el resultado siguiente, esta tabla también la utilizo para armar mi menú dinámico

    Las paginas que tengo son las siguientes:

    • Principal.Master --> Pagina maestra
    • default.aspx --> Pagina establecida como predeterminada que se muestra al ejecutar la aplicación
    • frmLogistica.aspx --> Pagina de trabajo del usuario Juan Perez
    • frmAdmin.aspx --> Pagina de trabajo del usuario Paco.

    El código para restringir a los usuarios lo tengo en la pagina maestra pero cuando la ejecuto en mi localhost funciona de maravilla y al momento de publicar y consultar la pagina en el navegador obtengo este mensaje ERR_TOO_MANY_REDIRECTS donde al parecer la pagina default.aspx se esta redirigiendo varias veces como un ciclo infinito.

    Este es el código de mi pagina maestra. Trabajo en tres capas.

    DataSet Menu = new DataSet();
    DataTable _menuPadre = new DataTable();
    
    protected void Page_Load(object sender, EventArgs e)
    {
     if (!IsPostBack)
        {               
    
            Transacciones t = new Transacciones(); // Capa de transacciones esta funciona bien.
            System.Security.Principal.WindowsIdentity usuario = System.Security.Principal.WindowsIdentity.GetCurrent();
    
    
             string url_pagina = Request.Url.AbsolutePath.Substring(Request.Url.AbsolutePath.LastIndexOf("/") + 1);
            List<string> paginas_guardadas = new List<string>();
    
    
            Menu = t.Mostrar_Menu(usuario.Name);// Nombre de usuario Juan por tanto tiene permisos y entra en else
            _menuPadre = Menu.Tables[1];
    
            if (_menuPadre.Rows.Count == 0) // Verifico si la segunda tabla del resultado no tiene registros lo envio a una pagina web interna.
            {
                Response.Redirect("https://www.google.com.mx", true);
            }
            else
            {
                // Si hay registros en la segunda tabla recorro los registros para guardar todas las paginas en una lista de las que el usuario tiene "acceso".
                foreach (DataRow item in _menuPadre.Rows)
                {
                    string nombre_pagina;
                    nombre_pagina = item[4].ToString();
                    nombre_pagina = nombre_pagina.Replace("/FolderTest/", "");
                    paginas_guardadas.Add(nombre_pagina);//Guardo las paginas del usuario.
                }
    
    
                // Comparo la pagina guardada con la de la url.
                bool elemento_encontrado = paginas_guardadas.Any(x => x == url_pagina);
    
    
                    // Como la pagina default.aspx no se encuentra en las lista de paginas guardadas por el usuario entra en if ya que url_pagina.EndsWith("default.aspx")
                    // Dentro de default.aspx tengo un menu que me redirige a frmLogistica por tanto entra en if ya que la pagina si se encuentra en la lista.
                     if ((elemento_encontrado == true) || (url_pagina.EndsWith("default.aspx", StringComparison.CurrentCultureIgnoreCase)))
                    {
                        form1.Action = Request.RawUrl;
                    }       
    
    
                   // Cuando coloco en la url frmAdmin.aspx entra en esta condición ya que no esta guardada la pagina pero al entrar en el response vuelve arriba y se ejecuta por segunda vez entrando en el if 
    
                    else
                    {
                        Response.Redirect("~/default.aspx", true);
    
                    }                
    
    
                rptMenu.DataSource = t.Mostrar_MenuSubmenu(usuario.Name); 
                rptMenu.DataBind(); //cargo el  menu.
    
    
            }
    
    
        }
    
    }

    En mi pagina de default solo tengo este código para mostrar los datos del usuario.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Transacciones t = new Transacciones();
            EUsuario entidades_usuario = new EUsuario();
            System.Security.Principal.WindowsIdentity usuario = System.Security.Principal.WindowsIdentity.GetCurrent();
    
            entidades_usuario = t.Consultar_Datos(usuario.Name);
    
            if (entidades_usuario.Usuario != "" || entidades_usuario.Nombre_usuario != "" || entidades_usuario.Puesto)
            {
                lblUserWindows.Text = entidades_usuario.Usuario;
                lblNombre_usuario.Text = entidades_usuario.Nombre_usuario;
                lblPuesto.Text = entidades_usuario.Puesto;
    
            }
    
        }
    }

    En mi web config tengo este código:

    <authentication mode="Windows"/>
    <identity impersonate="true"/>
    <customErrors mode="Off"/>

    Espero puedan ayudarme ya que como mencione en mi localhost funciona bien pero al publicar y consultar la pagina en el navegador me marca el mensaje ERR_TOO_MANY_REDIRECTS.


    viernes, 8 de noviembre de 2019 23:30