none
Definir permisos usuarios desde base de datos Asp.Net

    Question

  • Hola a todos, resulta que tengo en una base de datos a usuarios con sus respectivos nombre de usuario y contraseña, el problema pasa que dependiendo del usuario que ingresa este puede visualizar ciertas paginas y el contenido del menu debe ser distintos dependiendo del usuario, pero sin cambiar apariencia ni nada por el estilo. Ya he visto el tema de definir ciertas configuraciones en el web config, pero nada con usuarios desde una base de datos, que por cierto esta en sql server 2008, por lo que me gustaria saber o me indicasen el camino por el cual debo ir para lograr lo recien expuesto.

    Bueno espero haberme entendido, y desde ya muchas gracias.

    Thursday, February 24, 2011 7:18 PM

Answers

  • Hola Arieluko, el tema de que se puedan visualizar ciertas paginas y otras no, hace entender que deseas emplear perfiles de usuario, para esto no hay nada automatico.. . todo lo defines desde la BD, y validas con consultas....

    En el WebConfig... defines el tipo de autenticacion que vas a usar, te recomiendo este tuto de el Guille:

    http://www.elguille.info/NET/ASPNET/tutorialLogin/tutorialLogin.htm

    Cualquier duda solo avisa ;)


    Nicolás Herrera
    Bogotá - Colombia
    "Daría todo lo que sé, por la mitad de lo que ignoro. " Rene Descartes
    • Marked as answer by arieluko Thursday, February 24, 2011 8:58 PM
    Thursday, February 24, 2011 7:51 PM
  • Supongo que tienes los usuarios asociados a roles,

    Si no utilizas roles entonces piensa que serán roles los que utilizaras en el ejemplo que te pongo:

    Abre tu Global.asax y en el Evento AuthenticateRequest de Application

    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
            ' Se desencadena al intentar autenticar el uso
            If Request.IsAuthenticated = True Then
                Dim roles() As String = Nothing

                ' Crear una cookie de los si no existe una para la sesion.
                If Request.Cookies("roles_" + User.Identity.Name) Is Nothing Then

                    'Obtener roles de la base y agregar la cookie
                    Dim componenteUsuarios As New componenteUsuarios
                    Dim strRoles As String = "" ' Los roles deben de ser devueltos separados por ; o cualquier separador que quiere
                    strRoles = componenteUsuarios.ObtenerRoles(User.Identity.Name) 'Enviar el Usuario Conectado
                    componenteUsuarios = Nothing

                    'Si notas en el ejemplo he puesto 2 horas que durará la cookie para que expire, ahi se le envía de parametro los roles
                    Dim ticket As New FormsAuthenticationTicket(1, _
                        Context.User.Identity.Name, _
                        DateTime.Now, _
                        DateTime.Now.AddHours(2), _
                        False, _
                        strRoles)

                    ' Encriptar el ticket de autenticación
                    Dim cookieStr As String = FormsAuthentication.Encrypt(ticket)

                    ' Enviar la cookie al cliente como parte del HTML
                    Response.Cookies("roles_" + User.Identity.Name).Value = cookieStr
                    Response.Cookies("roles_" + User.Identity.Name).Path = "/"
                    Response.Cookies("roles_" + User.Identity.Name).Expires = DateTime.Now.AddHours(2)

                Else

                    ' Obtener los roles de la cookie
                    Dim ticket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(Context.Request.Cookies("roles_" + User.Identity.Name).Value)

                    'Convertir el string en un arreglo de strings convert the string representation of the role data into a string array
                    Dim RolesDeUsuario As New ArrayList

                    Dim rol As String

                    For Each rol In ticket.UserData.Split(New Char() {";"c})
                        RolesDeUsuario.Add(rol)
                    Next

                    roles = CType(RolesDeUsuario.ToArray(GetType(String)), String())

                End If

                ' Agregar tu Seguridad Propia al request para que contenga los roles
                Context.User = New GenericPrincipal(User.Identity, roles)
            End If

    Posteriormente en cada carpeta donde tengas tus páginas debes de agregar un web.config debes de definir que roles accederán que páginas de la siguiente forma:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.web>
        <authorization>
          <allow roles="Administradores" />
          <allow roles="Consulta" />
          <deny users="*" />
        </authorization>   
      </system.web>

      <location path="MantenimientoPaises.aspx">
        <system.web>
          <authorization>
            <allow roles="Administradores" />
            <deny users="*" />
          </authorization>
        </system.web>
      </location>

      <location path="ConsultaPaises.aspx">
        <system.web>
          <authorization>
            <allow roles="Administradores" />
            <allow roles="Consulta" />
            <deny users="*" />
          </authorization>
        </system.web>
      </location>

    </configuration>

    Si ves en la configuración he dejado que la página MantenimientoPaises.aspx solo sea accedida por los usuarios que se encuentren en el Rol "Administradores" y los usuarios que únicamente estén en el Rol de "Consulta" solo podrán ver la página de ConsultaPaises.aspx

    Cualquier duda estoy a la orden

    Suerte


    Elmer Carías
    • Proposed as answer by Elmer Carías Thursday, February 24, 2011 8:45 PM
    • Marked as answer by arieluko Thursday, February 24, 2011 8:58 PM
    Thursday, February 24, 2011 8:12 PM

All replies

  • Hola Arieluko, el tema de que se puedan visualizar ciertas paginas y otras no, hace entender que deseas emplear perfiles de usuario, para esto no hay nada automatico.. . todo lo defines desde la BD, y validas con consultas....

    En el WebConfig... defines el tipo de autenticacion que vas a usar, te recomiendo este tuto de el Guille:

    http://www.elguille.info/NET/ASPNET/tutorialLogin/tutorialLogin.htm

    Cualquier duda solo avisa ;)


    Nicolás Herrera
    Bogotá - Colombia
    "Daría todo lo que sé, por la mitad de lo que ignoro. " Rene Descartes
    • Marked as answer by arieluko Thursday, February 24, 2011 8:58 PM
    Thursday, February 24, 2011 7:51 PM
  • Supongo que tienes los usuarios asociados a roles,

    Si no utilizas roles entonces piensa que serán roles los que utilizaras en el ejemplo que te pongo:

    Abre tu Global.asax y en el Evento AuthenticateRequest de Application

    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
            ' Se desencadena al intentar autenticar el uso
            If Request.IsAuthenticated = True Then
                Dim roles() As String = Nothing

                ' Crear una cookie de los si no existe una para la sesion.
                If Request.Cookies("roles_" + User.Identity.Name) Is Nothing Then

                    'Obtener roles de la base y agregar la cookie
                    Dim componenteUsuarios As New componenteUsuarios
                    Dim strRoles As String = "" ' Los roles deben de ser devueltos separados por ; o cualquier separador que quiere
                    strRoles = componenteUsuarios.ObtenerRoles(User.Identity.Name) 'Enviar el Usuario Conectado
                    componenteUsuarios = Nothing

                    'Si notas en el ejemplo he puesto 2 horas que durará la cookie para que expire, ahi se le envía de parametro los roles
                    Dim ticket As New FormsAuthenticationTicket(1, _
                        Context.User.Identity.Name, _
                        DateTime.Now, _
                        DateTime.Now.AddHours(2), _
                        False, _
                        strRoles)

                    ' Encriptar el ticket de autenticación
                    Dim cookieStr As String = FormsAuthentication.Encrypt(ticket)

                    ' Enviar la cookie al cliente como parte del HTML
                    Response.Cookies("roles_" + User.Identity.Name).Value = cookieStr
                    Response.Cookies("roles_" + User.Identity.Name).Path = "/"
                    Response.Cookies("roles_" + User.Identity.Name).Expires = DateTime.Now.AddHours(2)

                Else

                    ' Obtener los roles de la cookie
                    Dim ticket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(Context.Request.Cookies("roles_" + User.Identity.Name).Value)

                    'Convertir el string en un arreglo de strings convert the string representation of the role data into a string array
                    Dim RolesDeUsuario As New ArrayList

                    Dim rol As String

                    For Each rol In ticket.UserData.Split(New Char() {";"c})
                        RolesDeUsuario.Add(rol)
                    Next

                    roles = CType(RolesDeUsuario.ToArray(GetType(String)), String())

                End If

                ' Agregar tu Seguridad Propia al request para que contenga los roles
                Context.User = New GenericPrincipal(User.Identity, roles)
            End If

    Posteriormente en cada carpeta donde tengas tus páginas debes de agregar un web.config debes de definir que roles accederán que páginas de la siguiente forma:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.web>
        <authorization>
          <allow roles="Administradores" />
          <allow roles="Consulta" />
          <deny users="*" />
        </authorization>   
      </system.web>

      <location path="MantenimientoPaises.aspx">
        <system.web>
          <authorization>
            <allow roles="Administradores" />
            <deny users="*" />
          </authorization>
        </system.web>
      </location>

      <location path="ConsultaPaises.aspx">
        <system.web>
          <authorization>
            <allow roles="Administradores" />
            <allow roles="Consulta" />
            <deny users="*" />
          </authorization>
        </system.web>
      </location>

    </configuration>

    Si ves en la configuración he dejado que la página MantenimientoPaises.aspx solo sea accedida por los usuarios que se encuentren en el Rol "Administradores" y los usuarios que únicamente estén en el Rol de "Consulta" solo podrán ver la página de ConsultaPaises.aspx

    Cualquier duda estoy a la orden

    Suerte


    Elmer Carías
    • Proposed as answer by Elmer Carías Thursday, February 24, 2011 8:45 PM
    • Marked as answer by arieluko Thursday, February 24, 2011 8:58 PM
    Thursday, February 24, 2011 8:12 PM
  • Gracias Nocoloco y Elmer por sus respuestas, aunque el ejemplo que me diste Nicoloco ya lo habia examinado =D

    Elmer, me podrías ayudar, creo que tu ejemplo se acerca a lo que necesito, pero como puedo obtener el rol DESDE la base de datos? tengo definida una tabla llamada usuario, que tiene su login, pasword y tipo de usuario, supongo que el tipo de usuario se refiere al rol que tu mencionas, pero como lo puedo hacer desde una consulta sql? y si pudieras me dieces el ejemplo en C#, gracias!!

    Thursday, February 24, 2011 9:03 PM