none
Al compilar un website no funcionan los roles RRS feed

  • Pregunta

  • Hola a Todos.
    Estoy creando un web site en asp.net, en modalidad de desarrollo los roles funcionan perfecto pero, cuando compilo y paso la aplicación al hosting los roles dejan de funcionar, hice una prueba en la carpeta del compilado y efectivamente tampoco le funcionan los roles.

    Alguien ha podido resolver esto?

    Gracias de antemano.
    jueves, 19 de marzo de 2009 21:51

Todas las respuestas

  • Cuando hablas de roles, imagino que te refieres al empaquetado que viene con ASP.NET.

    Puedes copiar los elementos Membership y Roles de tu web.config?, lo más probable es que este apuntando a otra base de datos. Cuando ejecutaste el aspnet_regsql.exe a que base de datos apuntaste?

    Saludos,
    Sergio Tarrillo - http://sergiot2.com/blog/
    Si la respuesta ha sido de utilidad marca la como respuesta correcta.
    jueves, 19 de marzo de 2009 22:45
  • Estoy usando MySql 5.0 ya que es la base de datos del Hosting, en el web.config tengo un grupo de instrucciones que funcionan bién. 

    <connectionStrings>
        <
    remove name="MySqlServerConString"/>
        <add name="MySqlServerConString"     connectionString="server=hostingdatabasserver;user  
        id=server_userid; password=server_password; database=DB_name; persist security info=True
    " providerName="MySql.Data.MySqlClient.MySqlConnection"/>
    </
    connectionStrings>

    <system.web>

    <authorization>
         <
    allow roles="Administrador" />
    </
    authorization>

    <membership defaultProvider="MySqlMembershipProvider" userIsOnlineTimeWindow="15">
        <
    providers>
            <
    clear/>
            <
    add name="MySqlMembershipProvider"
                    
    type="MySql.Web.Security.MySQLMembershipProvider"
                    
    connectionStringName="MySqlServerConString"
                    
    autogenerateschema="true"
                    
    applicationName="app_name"
                    
    enablePasswordRetrieval="false"
                    
    enablePasswordReset="true"
                    
    requiresQuestionAndAnswer="true"
                    
    requiresUniqueEmail="true"
                    
    passwordFormat="Hashed"
                    
    writeExceptionsToEventLog="true"/>
        </
    providers>
    </
    membership>

    <roleManager defaultProvider="AspNetMySqlRoleProvider"
        
    enabled="true"
        
    cacheRolesInCookie="true"
        
    cookieName=".ASPROLES"
        
    cookieTimeout="30"
        
    cookiePath="\"
        
    cookieProtection="All" >
        <
    providers>
            <
    add name="AspNetMySqlRoleProvider"
                    
    type="MySql.Web.Security.MySQLRoleProvider"
                    
    connectionStringName="MySqlServerConString" />
        </
    providers>
    </
    roleManager>

    </system.web>

    Además están agregadas las referencias para los drivers de mysql:

    <add assembly="MySql.Data, Version=5.2.5.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D"/>
    <
    add assembly="MySql.Web, Version=5.2.5.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D"/>

    Asi como en la carpeta Bin.

    Cuando ejecutas la configuración de asp.net lo hace correctamente y no crea la base de datos ASPNETDB.MDF lo cual es correcto, ya que estoy trabajando con MySQL, asimismo, crea las tablas para el control de los login, membership etc en mysql, los perfiles, usuarios y permisos están correctamente asociados en la base de datos MySQL.

    Si ejecutas la aplicación con código fuente desde visual studio Ctrl-F5, este ejecuta los perfiles en forma impecable y por supuesto no levanta ninguna otra base de datos.
    Luego cuando publicas el website, y lo ejecutas en el equipo desde visual studio Ctrl-F5 los perfiles no funcionan correctamente
    Lo mismo ocurre cuando copias al hosting el website y lo ejecutas desde ahí.

    Sds.

    viernes, 20 de marzo de 2009 10:39
  • Tienes en producción la base de datos con los roles, a parte de la de la aplicación?
    Blog de desarrollo / Development blog
    viernes, 20 de marzo de 2009 13:36
  • Creo que te haz confundido. Persis security info, es de una conexión SQL Server, las conexiones disponibles en mysql, las puedes ver en el siguiente link: http://www.connectionstrings.com/mysql.

    Cuando se ejecuta el aspnet_regsql, lo hace contra una base de datos. Crea unas tablas y procedures, en una base de datos SQL Server (no crea las tablas en una base de datos MySql).

    Por lo que se puede definir, que todo el esquema del modelo de seguridad de ASP.NET lo haz ejecutado contra una base de datos SQL SErver, y localmente funciona por que esta el SQL SErver. Pero cuando subes al servidor, no encuentra la base de datos SQL y por eso te da el error.

    Lo que deberías hacer es migrar los queries generados para SQL Server, al queries para MySQL. Como en el siguiente artículo: http://www.codeproject.com/KB/database/mysqlmembershipprovider.aspx.

    Esta clase: MySql.Web.Security.MySQLMembershipProvider, tu la haz creado? o la haz descargfado de los providers en la página oficial de MySQL?

    Saludos,
    Sergio Tarrillo - http://sergiot2.com/blog/
    Si la respuesta ha sido de utilidad marca la como respuesta correcta.
    viernes, 20 de marzo de 2009 13:54
  • Hola Jesús.
    Si efectivamente tengo en el hosting la base de datos MySQL, con las tablas creadas en forma automática por el ASP.net configuration. de hecho las pruebas las estoy realizando conectandome directamente al hosting, tanto en tiempo de desarrollo como en ejecución, jamas me conecto localmente y la base de datos ASPNETDB.MDF no exite ni es invocada en ningún momento.

    Sds.
    viernes, 20 de marzo de 2009 15:27
  • Hola Sergio.

    Tal como le explique a Jesús estoy usando MySql, he creado algunos dataset donde puedo ver la data cargada en las tablas de (Roles, user, membership etc...) lo que significa ,que tengo conexión con la BD y a sus datos.

    Colocando el scrip que indique antes, al levantar el asp.net configuration no te muestra el proveedor de sql server solo el de MySQL y efectivamente crea las tablas en la base de datos remota ya que veo las tablas y sus datos en las utilidades del hosting.

    La base de datos ASPNETDB.MDF no existe en mi equipo por ningún lado, te podría comprar la idea de que es un problema de relacionado con la sql server si no fuera por el hecho de :

    1.  Cuando trabajo en modo de desarrollo no tengo problemas con los roles, conectandome con la base de datos que está en el hosting
    2. Cuando realizo el (Publish Web Site), el guarda el precompilado en el mismo equipo en mi caso un directorio que el nombre de (C:\PROYECTOS ASP.NET\WebSite), lo que hago es que ejecuto desde visual studio el precompilado y los roles no funcionan adecuadamente, lo cual escarta la posibilidad de usar sql server ya que no he pasado la aplicación al hosting.
    3. Al pasar la aplicación al hosting puedo ver los datos que están guardados en las tablas de seguridad pero la autenticación por forma no funciona en forma correcta.

    Los drivers son de MySQL creados por Sun

    Sds.
    viernes, 20 de marzo de 2009 15:48
  • Podrias indicar que problema obtienes? Algun mensaje error o algo? Cuando haz publicado tu Web Site, haz verificado que tambien se publique System.Data.MySQl.dll o el nombre de ensablado de mySql? Si no puedes identicar el error, puedes verlo en el EventViewer.

    La mejor prueba, es que localmente lo levantes en el IIS, y no con el Visual Studio. Para hacerlo al estilo como va a funcionar en el hosting.

    Saludos,
    Sergio Tarrillo - http://sergiot2.com/blog/
    Si la respuesta ha sido de utilidad marca la como respuesta correcta.
    viernes, 20 de marzo de 2009 16:09
  •  EN realidad no envia ningún error, lo único es que ignora el rol asignado a un usuario,
    Por ejemplo:
    Tengo un rol vendedor que puede entrar al modulo de ventas pero no pude entrara al módulo deinventario
    Cuando lo ejecuto en mi equipo esto funciona perfectamente, el usuario ingresa con su contraseña y no puede entrar a sitio restringido.

    Cuando lo ejecuto en el hosting, el usuario entra con su clave, y le permite entrar a los sitios restringidos.

    Por otro lado todas las referencias de los dll de mysql están disponibles y enviadas al hosting en la carpeta BIN, así como también están referenciadas en el web.config


    Voy a realizar la prueba con IIS a ver que encuentro.

    Sds.


    viernes, 20 de marzo de 2009 16:59
  • Por el momento, crea una pagina de prueba: PruebaSeguridadRoles.aspx. Y en esta muestra el usuario de Login: Page.User.Identity.Name, y ademas con un foreach recorre los roles del usuario usando clase Roles, y muestralos en un combo o en algun otro control. Con eso podemos identificar rápidamente que rol es el actual.

    Por lo que veo, solo es un problema lógico y no de conexión. El título daba sugerencia de un problema de conexión o configuración.

    Para denegar permiso a ciertas carpetas estas usando el elemento location en el web.config: http://msdn.microsoft.com/en-us/library/b6x6shw7.aspx, con eso deniegas el acceso a una carpeta o pagina para un rol de ASP.NET. Por ejemplo ago así:

    <location path="ADMIN">  
        <system.web> 
          <authorization> 
            <allow roles="ADMIN"/>  
            <deny users="*"/>  
          </authorization> 
        </system.web> 
      </location> 
      <location path="Publishers">  
        <system.web> 
          <authorization> 
            <allow roles="PUBLISHER, ADMIN"/>  
            <deny users="*"/>  
          </authorization> 
        </system.web> 
      </location> 
     

    Los roles, son los que están en tu tablas roles de MySql. Path puede ser una carpeta o una página, lo recomendable es que sea una carpeta.

    Saludos,
    Sergio Tarrillo - http://sergiot2.com/blog/
    Si la respuesta ha sido de utilidad marca la como respuesta correcta.
    viernes, 20 de marzo de 2009 17:37
  • Hola Buen Dia
    Me disculpo por no haber contestado antes.

    Sergio, efectivamente el problema estaba en la configuración pero no a nivel de los location, estaba focalizado en el string que contiene la activación de los membershipprovider.

    Para todo aquel que requiera usar la facilidad de membershipprovider con MySql muestro el código que usé, está 100% funcional.

    Debe tener instalado los drivers de MySql los cuales se obtienen en la página oficial de Mysql, en mi caso usé la Version=5.2.5.0, y lo pueden buscar aquí, http://dev.mysql.com/downloads/connector/net/5.2.html

    luego debe agregar la referencia de los drivers que se encuentran en las carpetas:

    C:\Archivos de programa\MySQL\MySQL Connector Net 5.2.5\Binaries\.NET 2.0\ MySql.Data.dll
    C:\Archivos de programa\MySQL\MySQL Connector Net 5.2.5\Web Providers\MySql.Web.dll

    Una vez hecho esto,  automáticamente debe mostrarse estos dll en la carpeta Bin de nuestra aplicación y en los assembly del web.config

    No copiar se genera solo
    <
    assemblies>
        <
    add assembly="MySql.Data, Version=5.2.5.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D"/>
        <
    add assembly="MySql.Web, Version=5.2.5.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D"/>
    </assemblies>

    Pasos posteriores:

    1. Configurar correctamente el conectionStrings

    <connectionStrings>
        <
    remove name="MySqlServerConString"/>
        <
    add name="MySqlServerConStringconnectionString="server=servidor Remoto o Local de la BD;user id=Usuario de la BD; password=Contraseña; database=Nombre de la Base de datos o la instancia; Port=3306; Protocol=TCP; Compress=false; Pooling=true; Connection Lifetime=0; persist security info=False;"providerName="MySql.Data.MySqlClient.MySqlConnection"/>
    </
    connectionStrings>

    2. Establecer como va a funcionar el ASP.NET configuration

    Colocarlo dentro del system.web, puede ser al comienzo.

    <system.web>

    <membership defaultProvider="MySqlMembershipProvider" userIsOnlineTimeWindow="15">
    <
    providers>
        <
    clear/>
        <
    add name="MySqlMembershipProvider"
        
    type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=5.2.5.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D" // El Token es el de su equipo se toma del assembly
        
    connectionStringName="MySqlServerConString"
        
    autogenerateschema="true"
        
    applicationName="/"                   // Es en este punto donde se encontraba el problema
        
    passwordAttemptWindow="10"
        
    minRequiredNonalphanumericCharacters="1"
        
    maxInvalidPasswordAttempts="5"
        
    minRequiredPasswordLength="7"
        
    enablePasswordRetrieval="false"
        
    enablePasswordReset="true"
        
    requiresQuestionAndAnswer="true"
        
    requiresUniqueEmail="false"
        
    passwordFormat="Clear"
        
    passwordStrengthRegularExpression=""
        
    writeExceptionsToEventLog="true"/>
    </
    providers>
    </
    membership>

    <roleManager enabled="true"
        defaultProvider="MySqlRoleProvider"
        
    cacheRolesInCookie="true"
        
    cookieName=".ASPROLES"
        
    cookieTimeout="30"
        
    cookiePath="/"
        
    cookieRequireSSL="false"    
        
    cookieSlidingExpiration="true"
        
    cookieProtection="All" >
    <
    providers>
    <
    clear/>
    <
    add connectionStringName="MySqlServerConString"
        
    name="MySqlRoleProvider"
        
    type="MySql.Web.Security.MySQLRoleProvider, MySql.Web, Version=5.2.5.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D"
        
    cacheRolesInCookie="true"
        
    applicationName="/"   // Es en este punto donde se encontraba el problema eliminar este comentario al copiar
        
    writeExceptionsToEventLog="false"/>
    </
    providers>
    </
    roleManager>

    El problema radicaba en que, en los application de cada uno coloque un "/" en membershipprovider y "/virtualdir" en el del rolprovider como consecuencia creaba dos registros para aplicaciones diferentes  y dos regístros para el mismo usuario apuntando respectivamente a cada aplicación esto, crea un conflicto entre  la busqueda y no ejecutaba el rol adecuado en la tabla user.

    Una vez hecho esto, llaman la funcion asp.net configuration y crean los roles así como los usuarios, cuando asocien el rol y los permisos el asp.net crea un web.config en cada directorio, para el caso de MySql es totalmente inutil es  mejor seguir al paso 3

    3. Crear los location manualmete

    <location path="Carpeta_1">
            <
    system.web>
                <
    authorization>
                    <
    allow roles="Rol_1" />
                    <
    deny roles="Rol_2" />
                    <
    deny roles="Rol_3"/>
                    <
    deny roles="Rol_n + 1" />
                    <
    deny users="?" />
                </
    authorization>
            </
    system.web>
    </
    location>

    Puede realizar esto para cada una de las carpetas que desee proteger,

    Sds.

    • Propuesto como respuesta Marc Rubiño viernes, 15 de mayo de 2009 19:26
    miércoles, 25 de marzo de 2009 19:00