Fraccionamiento de las secciones de configuración en web.config

Aunque esto es algo muy poco conocido por los programadores de ASP.NET, es posible mover secciones completas de la configuración a sus propios archivos independientes de web.config. Ello se consigue usando el atributo configSource en la sección correspondiente. Por ejemplo, podemos escribir en el nodo ConnectionStrings lo siguiente:



<connectionStrings configSource=»conexiones.config»/> 

y ahora tener un archivo independiente llamado conexiones.config que contenga esa sección completa:



<connectionStrings> 
<add name=»Clientes» connectionString=»…»/>

<add name=»Principal» connectionString=»…»/>
</connectionStrings>

Esto puede resultar útil en muchas ocasiones. Por ejemplo, podemos cambiar más fácilmente entre los ajustes de producción y de desarrollo, manteniendo en común el resto de la configuración. Otro motivo sería proteger de manera especial esa sección y otorgarle sus propios permisos de lectura y escritura.


Uno de los motivos más importantes sería el evitar que se reinicie la aplicación ante determinados cambios. Por ejemplo si sacamos a un archivo la sección AppSettings de ajustes personales, a lo mejor no necesitamos que se reinicie la aplicación sólo modificar algo en ella. Al separarla a su propio archivo conseguiremos este efecto ya que cambia el archivo externo pero no el web.config, y aunque modifiquemos algo en él no se fuerza el reinicio.


Ello es debido a que en machine.config (la configuración principal del equipo) la sección AppSettings está marcada con el atributo restartOnExternalChanges=»false». Hay otras secciones que tiene este atributo a true por lo que si se cambia el archivo externo sí que provocaremos un reinicio.


Extraido del curso de preparación del examen 70-528 de desarrollo Web de campusMVP.

Sin categoría

12 thoughts on “Fraccionamiento de las secciones de configuración en web.config

  1. Lo que a mí me gustaría saber es, si se pueden tener dos secciones «authentication» independientes, o distribuidas de alguna manera por el archivo web.config.

    Es decir: Tengo una aplicación que necesita dos (2) páginas de login diferentes: una para los clientes y otra para el personal de nuestras oficinas. Al utilizar la suscripción (membership) y la autenticación por Forms, el atributo «loginUrl» apunta al archivo aspx donde quieres tener tu formulario de Login, no? Pues yo necesito poder tener dos.

    Y a ser posible, ahorrándome el «truco» de poner cada página de login en una subcarpeta dentro de la raiz de la aplicación, porque aunque de esta manera SI puedes tener dos ficheros web.config (uno por carpeta), esto te obliga a tocar cosas en el IIS, como declarar aplicaciones esas carpetas, etc.

    Si alguien sabe cómo puedo «jugar» con ese atributo loginUrl, o tener varias secciones authentication (he probado dentro de los tags Location, pero va a ser que no)… le estaría eternamente agradecido.

    Saludos

  2. Hola Pablo:

    A ver… dos cosas:

    1) No necesitas tocar nada en IIS para poder tener dos web.config. Puedes tener uno en cada carpeta física del disco sin problemas. No hace falta que sean carpetas virtuales ni nada similar, por lo que sí puedes meter un web.config diferente en cada una sin tener que tocar configuración alguna ni en IIS ni en otro lado.

    2) No entiendo porqué motivo si es la misma aplicación vas a necesitar tener dos formularios de login diferentes. No se me ocurre cuál puede ser la necesidad salvo que en uno pidas nombre y clave y en el otro nombre, clave y coordenada oq ue elsistema de autenticación sea completamente diferente. Lo que deberías hacer, salvo que sea este caso, es segmentar sus permisos con roles, pero la autenticación que sea la misma.

    En cualquier caso no es posible tener la misma sección duplicada en un archivo web.config. Además, aunque pudieras tenerla no tendrías forma de decidir cuál de las dos utilizar, salvo que las ataras a una URL concreta o algo así. De hecho puede ser una opción. Por ejemplo si el usuario entra por extranet.tudominio.com lo smandas a un login determinado y si entran por ‘nombreservidor’ directamente o tienen una IP privada (o sea usuarios internos) los mandas a otro lado o le muestas otros controles. Eso lo puedes hacer en la página de login común.

    Yo lo que harái sería caracterizar a mis usuarios y usar dos carpetas diferentes con un web.config independiente, o bien en la página de login mostrar un diálogo de autenticación u otro en función de quien sea el usaurio (si tienes claro como detectar quien es quien).

    Saludos

    JM

  3. Bueno pues ya que estamos aprovecho para preguntarte José a ver si me aclaras una cosilla:

    Tengo una aplicación en la que se necesitan 2 logins uno con usuario y contraseña y otro con usuario, contraseña y coordenada.

    Esto me obliga a modificar el membership provider o los controles d elogin que viene por defecto???

    Como lo harías tú, porque no me queda muy claro «Lo que deberías hacer, salvo que sea este caso, es segmentar sus permisos con roles, pero la autenticación que sea la misma.»

    Salu2

    Salu2

  4. Hola Luis:

    Si el método de login no es el tradicional de usuario contraseña o por lo que sea no te vale el sistema que trae ASP.NET 2.0 (por ejemplo porque ya tienes tu propia base de datos o API de autenticaicón propia) tendrás que crearte tu propio proveedor de Membership que utilice por debajo tu método de autenticación. Eso si quieres sacarle partido a Membershipy a los controles que vienen con ASP.NET 2.0, claro, que no es obligatorio 🙂

    De todos modos crear un proveedor propio de Membership es bastante fácil pues sólo hay que heredar de la clase MembershipProvider e implementar aquellas cosas específicas de tu mecanismo de autenticación.

    Saludos

    JM.

  5. Muchas gracias por el dato, me va a ser de mucha utilidad para un proyecto que estoy realizando, en el cual necesito generar en determinados momentos SiteMapProviders…

    Aún no lo he probado pero tiene buena pinta!

    Saludos!

  6. Hola a todos (este hilo está muy interesante, jeje)

    Mi sistema de Logins es «peculiar» debido a que en cada formulario, el textbox del Username lleva un RegExValidator con su propio patrón (ya que el «username» de nuestros clientes es el NIF, y el del personal de las oficinas es un código de 5 caracteres).

    Sobra decir (porque seguro que es el 99,99% de los casos) que la bbdd que te «fabrica» ASP.NET no me servía, y que además tengo que utilizar un schema que ya tiene la empresa. Por lo tanto, me fabriqué mi propio SqlMembershipProvider a partir del basado en ODBC que trae la MSDN como ejemplo, y también me he currado mi MembershipUser. Todo muy bien y muy bonito, PERO me falla ese pequeño detalle de que me es IMPOSIBLE tener dos formularios de Login distintos.

    No obstante, ya lo he solucionado 🙂 aunque de la manera más «chapu» (pero también la más sencilla, que suele ser siempre la opción que mejor funciona, remember KISS): Tengo otra página que actúa como portada y tiene dos links, los dos apuntan a la misma pagina de Login, PERO le paso un parámetro… Luego, en el aspx del login he puesto –LOS DOS– LoginWizards. Lo que hago es, en el evento Page_Load, poner el Visible=False de uno u otro en función del parámetro que le paso desde la «portada».

    Y lo mejor de todo es que funciona 😀

  7. como puedo configurar el tamaño, etc del password que se registra en la bd aspnetdb a atravez del we.config pero que esos cambio solo afecten a mi sitio.
    con el machine.config logre realizar todo esto pero como ya saben el machine.config es para toda las sitio que se encuentran en el servidor y es de la siguiente forma:

    Responder

  8. hola ya resolvi mi problema: la verdad en el post anterior ya estaba arreglado el asunto de como poder especificar la politica de los password como el cantidad maxima y minima de caracteres, si permitir caracteres especiales,etc.
    la clave para permitir esta configuracion es el Tag «»
    puesto que esto quita todas las referencias a proveedores de generaciones heredados y permite sólo los proveedores de generaciones agregados por la eqtiqueta «» actual.


    Responder

  9. Hola amigos tengo un tremendo problema haber quien me puede ayudar

    Primero tengo un sistemo mono empresa y quiero dejarlo multiempresa,bueno lo que mas se me ocurrio crear usuarios
    a los cuales le asigno la conexion de base de datos entonces hay los redirecciono a la base correspondiente.El tema que por ahi me dieron la idea que cambiara el web.config en contexto,bueno resulta todo bien pero el problema que no resulta el tema de cambiar solo en la session ,LO CAMBIA EN TODO EL SITIO WEB

Deja un comentario

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