Exportar (0) Imprimir
Expandir todo

Cómo: Utilizar el nivel de confianza medio en ASP.NET 2.0

Publicado: 21 de Diciembre de 2005

patterns & practices Developer Center (en inglés)

J.D. Meier, Alex Mackman, Blaine Wastell, Prashant Bansode, Andy Wigley, Kishore Gopalan

Microsoft Corporation

Este artículo se aplica a:
ASP.NET versión 2.0

Resumen: En este artículo se describe cómo se pueden ejecutar aplicaciones Web ASP.NET con el nivel de confianza medio. Si tiene varias aplicaciones alojadas en el mismo servidor, podrá utilizar la seguridad de acceso al código y el nivel de confianza medio para proporcionar el aislamiento de aplicación. Al definir y bloquear el nivel de confianza en el archivo Web.config en el nivel del equipo, podrá establecer la directiva de seguridad de todas las aplicaciones Web en el servidor. La ejecución del nivel de confianza medio en la versión 2.0 de ASP.NET resulta mucho más sencilla que en la versión 1.1, ya que cuando se utiliza ASP.NET 2.0 se tiene acceso a las bases de datos de Microsoft SQL Server. El nivel de confianza medio sigue ofreciendo un entorno con limitaciones para aislar aplicaciones, ya sea entre ellas o con respecto a otros recursos compartidos del servidor. Las aplicaciones del nivel de confianza medio no tienen acceso al Registro ni al registro de sucesos y tampoco poseen capacidad de reflexión. El acceso a Web se ve limitado por la dirección de red que se defina en el elemento <trust /> y el acceso al sistema de archivos se ve limitado por la jerarquía de directorios virtuales. Si la directiva de nivel de confianza medio resulta demasiado restrictiva, podrá crear y utilizar un archivo de directivas personalizado.

En esta página

Objetivos Objetivos
Descripción general Descripción general
Novedades de la versión 2.0 Novedades de la versión 2.0
Resumen del nivel de confianza medio Resumen del nivel de confianza medio
Resumen de los pasos Resumen de los pasos
Paso 1. Configuración del nivel de confianza medio Paso 1. Configuración del nivel de confianza medio
Paso 2. Bloqueo del nivel de confianza medio Paso 2. Bloqueo del nivel de confianza medio
Paso 3. Creación opcional de una directiva personalizada basada en el nivel de confianza medio Paso 3. Creación opcional de una directiva personalizada basada en el nivel de confianza medio
OleDbPermission, EventLogPermission y FileIOPermission OleDbPermission, EventLogPermission y FileIOPermission
Desarrollo del nivel de confianza medio Desarrollo del nivel de confianza medio
Recursos adicionales Recursos adicionales
Comentarios Comentarios
Soporte técnico Soporte técnico
Comunidad y grupos de noticias Comunidad y grupos de noticias
Colaboradores y revisores Colaboradores y revisores

Objetivos

  • Aprender a desarrollar aplicaciones Web mediante el nivel de confianza medio.

  • Aprender cuáles son las novedades sobre las aplicaciones Web de confianza parcial en ASP.NET versión 2.0.

  • Aprender las restricciones que se aplican al usar los niveles de confianza medios.

  • Configurar los niveles de confianza medios en la aplicación Web.

  • Modificar los niveles de confianza para crear niveles de confianza medios personalizados.

Descripción general

De forma predeterminada, las aplicaciones y servicios Web de ASP.NET 2.0 se ejecutan con niveles de plena confianza y pueden llevar a cabo operaciones con privilegios, así como tener acceso a recursos limitado únicamente por la seguridad del sistema operativo y las listas de control de acceso de Windows (ACL).

Para bloquear una aplicación ASP.NET y ofrecer un nivel adicional de aislamiento de aplicaciones en un entorno alojado, se puede utilizar la seguridad de acceso al código para restringir los recursos a los que tendrá acceso la aplicación así como las operaciones con privilegios que podrá ejecutar. Para ello, configure el elemento <trust> tal y como se muestra a continuación.

<trust level="Full|High|Medium|Low|Minimal" />

El elemento <trust> admite un número de niveles de confianza predeterminados. Cada nivel de la sucesión ofrece un entorno mas restrictivo (con menos permisos de seguridad de acceso al código) en el que ejecutar la aplicación.

Los proveedores de servicios de Internet (ISP) que necesiten alojar varias aplicaciones de numerosas empresas diferentes suelen utilizar con frecuencia el nivel de confianza medio para ayudar a garantizar que las aplicaciones no se pueden leer los datos entre sí ni interferir en sus operaciones. El nivel de confianza medio también coloca restricciones en los tipos de recursos compartidos del sistema al que tienen acceso las aplicaciones.

Novedades de la versión 2.0

Las principales diferencias entre ASP.NET versión 1.1 y ASP.NET versión 2.0 sobre los niveles de confianza son las siguientes:

  • En la versión 2.0, el nivel de confianza medio permite el acceso a SQL Server porque el proveedor .NET Framework Data para SQL Server ya no requiere el nivel de plena confianza.

  • En la versión 2.0, SmtpPermission está disponible para los niveles de confianza medio, alto y pleno. Esto permite a las aplicaciones enviar correo electrónico

  • En la versión 2.0, el proveedor de datos administrados de OLE DB ya no exige el nivel de plena confianza, aunque OleDbPermission no se concede de forma predeterminada a las aplicaciones con nivel de confianza medio. Para tener acceso al origen de datos de OLE DB desde un nivel de confianza parcial, tendrá que crear un archivo personalizado de directivas de confianza que conceda OleDbPermission a la aplicación, tal y como se describe más adelante en este documento.

  • En la versión 1.1, tenía que conceder el nivel de plena confianza al código para permitir el acceso al registro de sucesos. En la versión 2.0 de ASP.NET ya no tendrá que hacerlo, aunque seguirá teniendo que crear un archivo personalizado de directivas de confianza para conceder EventLogPermission, tal y como se describe más adelante en este documento.

  • En la versión 2.0 de ASP.NET, las aplicaciones con nivel de confianza medio tienen acceso a las bases de datos de SQL Server ya que el proveedor de datos administrados de SQL Server ya no exige el nivel de plena confianza y se concede el permiso SqlClientPermission a las aplicaciones con nivel de confianza medio. Las aplicaciones con nivel de confianza medio también pueden utilizar SqlNotificationPermission (introducido en ASP.NET versión 2.0), que les permite recibir notificaciones de SQL Server.

Resumen del nivel de confianza medio

Las principales restricciones que poseen las aplicaciones con nivel de confianza medio son las siguientes:

  • OleDbPermission no está disponible. Esto significa que no podrá utilizar el proveedor de datos OL DB administrados de ADO.NET para tener acceso a las bases de datos. No obstante, podrá utilizar el proveedor de SQL Server administrado para tener acceso a las bases de datos de SQL Server.

  • EventLogPermission no está disponible. Esto significa que no podrá tener acceso al registro de sucesos de Windows.

  • ReflectionPermission no está disponible. Esto significa que no puede usar la reflexión.

  • RegistryPermission no está disponible. Esto significa que no podrá tener acceso al Registro.

  • WebPermission está restringido. Esto significa que la aplicación sólo podrá comunicarse con una dirección o intervalo de direcciones que se definan en el elemento <trust>.

  • FileIOPermission está restringido. Esto significa que sólo podrá tener acceso a archivos de la jerarquía de directorios virtuales de la aplicación. En la jerarquía de directorios virtuales de la aplicación, tendrá concedidos los permisos para leer, escribir, anexar y descubrir rutas.

Tampoco podrá llamar al código no administrado o utilizar Enterprise Services.

Resumen de los pasos

Para utilizar el nivel de confianza medio en aplicaciones ASP.NET:

  • Paso 1. Configuración del nivel de confianza medio.

  • Paso 2. Bloqueo del nivel de confianza medio.

  • Paso 3. Creación opcional de una directiva personalizada basada en el nivel de confianza medio.

Paso 1. Configuración del nivel de confianza medio

Para configurar que una aplicación se ejecute con el nivel de confianza medio, agregue el siguiente elemento al archivo Web.config específico que se encuentra en el directorio raíz virtual de la aplicación o al archivo Web.config en el nivel del equipo.

<trust level="Medium" originUrl=" />

Nota

Si está presente el atributo originUrl, podrán utilizarlo algunos permisos, como WebPermission, para restringir la conectividad en un conjunto definido de direcciones.

Para configurar que todas las aplicaciones Web de un servidor se ejecuten con el nivel de confianza medio, agregue este elemento en el archivo Web.config en el nivel del equipo en la carpeta siguiente: %windir%\Microsoft.NET\Framework\{versión}\CONFIG.

De forma predeterminada, las aplicaciones Web se configuran para ejecutarse con el nivel de plena confianza, tal y como se muestra en la siguiente configuración predeterminada del archivo Web.config en el nivel del equipo.

<location allowOverride="true">
 <system.web>
   <securityPolicy>
     <trustLevel name="Full" policyFile="internal" />
     <trustLevel name="High" policyFile="web_hightrust.config" />
     <trustLevel name="Medium" 
                 policyFile="web_mediumtrust.config" />
     <trustLevel name="Low"  policyFile="web_lowtrust.config" />
     <trustLevel name="Minimal" 
                 policyFile="web_minimaltrust.config" />  
   </securityPolicy>
   <trust level="Full" originUrl=" />
 </system.web>
</location>

Para revisar el conjunto completo de permisos disponibles en las aplicaciones con nivel de confianza medio, consulte el archivo Web_mediumtrust.config.

Paso 2. Bloqueo del nivel de confianza medio

Los proveedores de servicios de aplicaciones, o todo aquel que sea responsable de ejecutar varias aplicaciones Web en el mismo servidor, deben aplicar la configuración de directiva de nivel de confianza medio en el archivo Web.config en el nivel del equipo y, a continuación, bloquear el nivel de confianza en todas las aplicaciones Web.

Para hacer esto, establezca el atributo allowOverride en false en el archivo Web.config en el nivel del equipo, tal y como se muestra en el ejemplo de código siguiente.

<location allowOverride="false">
 <system.web>
   <securityPolicy>
     <trustLevel name="Full" policyFile="internal" />
     <trustLevel name="High" policyFile="web_hightrust.config" />
     <trustLevel name="Medium"
                 policyFile="web_mediumtrust.config" />
     <trustLevel name="Low"  
                 policyFile="web_lowtrust.config" />
     <trustLevel name="Minimal" 
                 policyFile="web_minimaltrust.config" />  
   </securityPolicy>
   <trust level="Medium" originUrl=" />
 </system.web>
</location>

Al establecer allowOverride="false", un desarrollador individual no puede anular la configuración de directiva de nivel de confianza medio en el archivo Web.config de su aplicación.

Paso 3. Creación opcional de una directiva personalizada basada en el nivel de confianza medio

Si el nivel de confianza medio resulta ser demasiado restrictivo, puede crear un archivo de directivas personalizado basado en la directiva de nivel de confianza medio. Por ejemplo, puede que desee permitir que las aplicaciones puedan realizar alguna de las siguientes acciones: conectar con una base de datos de Oracle, escribir sucesos en el registro de sucesos de Windows o leer archivos desde un directorio específico externo a la jerarquía de directorios virtuales de la aplicación.

Para crear una directiva personalizada basada en el nivel de confianza medio

  1. Copie el archivo de directiva de nivel de confianza medio web_MediumTrust.config, que se ubica en el directorio indicado a continuación, para crear un nuevo archivo de directiva en ese mismo directorio: %windir%\Microsoft.NET\Framework\{Versión}\CONFIG

    Asígnele un nombre que indique que se trata de una variación del nivel de confianza medio; por ejemplo, podría asignarle el nombre customWeb_MediumTrust.config.

  2. Agregue los permisos que desee conceder. En el ejemplo siguiente, se ha modificado el permiso FileIOPermission para permitir el acceso de lectura a un directorio específico externo a la jerarquía de directorios virtuales de la aplicación.

    <PermissionSet
        class="NamedPermissionSet"
        version="1"
        Name="ASP.Net">
      ...
        <IPermission
             class="FileIOPermission"
           version="1"
             Read="C:\SomeDir;$AppDir$"
             Write="$AppDir$"
             Append="$AppDir$"
             PathDiscovery="$AppDir$"
    />
      ...
    </PermissionSet>
    
  3. Cree un nuevo nivel personalizado de directivas en el archivo Web.config en el nivel del equipo. El archivo de directiva es el nombre del archivo de directiva que ha creado en el paso 1.

    <securityPolicy>
      <trustLevel name="CustomMedium" 
                  policyFile="customWeb_mediumtrust.config" />
      ...
    </securityPolicy>
    
  4. Configure las aplicaciones para que se ejecuten en el nuevo nivel personalizado de directiva al establecer el nivel de confianza en "CustomMedium". La directiva de seguridad tendrá un aspecto parecido al siguiente ejemplo

    <system.web>
      <securityPolicy>
       <trustLevel name="CustomMedium"
                   policyFile="customWeb_mediumtrust.config" />
       <trustLevel name="Full" policyFile="internal" />
       <trustLevel name="High" 
                   policyFile="web_hightrust.config" />
       <trustLevel name="Medium" 
                   policyFile="web_mediumtrust.config" />
       <trustLevel name="Low"  policyFile="web_lowtrust.config" />
       <trustLevel name="Minimal"
                   policyFile="web_minimaltrust.config" />
     </securityPolicy>
     <trust level="CustomMedium" originUrl=" />
    </system.web>
    

OleDbPermission, EventLogPermission y FileIOPermission

A continuación se muestran los permisos comunes que puede que le interese agregar:

  • OleDbPermission

  • EventLogPermision

  • FileIOPermission

OleDbPermission

Si admite varios tipos de servidor de bases de datos, tendrá que conceder el permiso OleDbPermission a las aplicaciones Web además del permiso SqlClientPermission, que ya habrá concedido la directiva de nivel de confianza medio.

Para ampliar la directiva de nivel de confianza medio de forma que conceda el permiso OleDbPermission

  • Cree un archivo de directiva personalizado y configure la aplicación para que utilice el nivel de confianza personalizado, tal y como se describe en el apartado anterior "Creación opcional de una directiva personalizada basada en el nivel de confianza medio" de este documento.

  • Agregue la siguiente clase de permiso a la sección <SecurityClasses>.

    <SecurityClass Name="OleDbPermission" 
                   Description="System.Data.OleDb.OleDbPermission, System.Data, Version=2.0.0.0, 
                                Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    
  • Agregue OleDbPermission sin restricciones al conjunto de permisos denominado "ASP.Net", tal y como se muestra en el siguiente ejemplo.

    <PermissionSet
        class="NamedPermissionSet"
        version="1"
        Name="ASP.Net">
      ...
         <IPermission class="OleDbPermission" 
                      version="1" 
                      Unrestricted="true"/>
         ...
       </PermissionSet>
    

Bloqueo de las cadenas de conexión

La adición del permiso OleDbPermission sin restricciones al archivo de directiva significa que la aplicación podrá utilizar cualquier proveedor de OLE DB en el servidor. En los entornos alojados, los administradores puede que necesiten utilizar la forma más avanzada de la sintaxis OleDbPermission para bloquear las cadenas de conexión utilizadas con OleDbPermission y así permitir el acceso únicamente a bases de datos específicas. En el siguiente ejemplo se muestra cómo restringir el acceso a un origen de datos específico de OLE DB.

<IPermission class="OleDbPermission"
             version="1">
  <add ConnectionString=
          "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\data\w4w.mdb"
       KeyRestrictions="
       KeyRestrictionBehavior="AllowOnly"/>
</IPermission>

El elemento <add> admite los siguientes atributos:

  • ConnectionString. Este elemento especifica una cadena de conexión permitida.

  • KeyRestrictions. Este elemento especifica parámetros de cadenas de conexión adicionales que pueden o no agregarse a la cadena de conexión en función del valor del permiso KeyRestrictionBehavior. Especifique los parámetros de cadena de conexión mediante la sintaxis parameterName=. Si desea especificar varios parámetros, separe cada uno con un punto y coma (;).

  • KeyRestrictionBehavior. Puede establecer este permiso con el valor AllowOnly o PreventUsage.

    • Si utiliza el valor AllowOnly, sólo se podrán agregar los parámetros de cadena de conexión adicionales especificados en el atributo KeyRestrictions al elemento ConnectionString.

    • Si utiliza el valor PreventUsage, sólo se podrán agregar los parámetros de cadena de conexión especificados en el atributo KeyRestrictions al elemento ConnectionString, si bien se podrán agregar otros parámetros de cadena de conexión.

S no se especifica ninguna restricción clave y el atributo KeyRestrictionBehavior se ha establecido con el valor AllowOnly, no se permitirá ningún parámetro de cadena de conexión adicional

S no se especifica ninguna restricción clave y la propiedad KeyRestrictionBehavior se ha establecido con el valor PreventUsage, se podrán agregar parámetros adicionales de cadena de conexión.

EventLogPermission

La directiva de nivel de confianza medio no permite el acceso al registro de sucesos de Windows.

Para habilitar el acceso al registro de sucesos

  1. Cree un archivo de directiva personalizado y configure la aplicación para que utilice el nivel de confianza personalizado, tal y como se describe en el apartado anterior "Creación opcional de una directiva personalizada basada en el nivel de confianza medio" de este documento.

  2. Agregue la siguiente clase de permiso a la sección <SecurityClasses> del archivo de directiva personalizado.

    <SecurityClasses>
      ...
      <SecurityClass Name="EventLogPermission"
                     Description="System.Diagnostics.EventLogPermission, System, Version=2.0.0.0, 
                                 Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      ...
    </SecurityClasses>
    
  3. Agregue el siguiente permiso EventLogPermission al conjunto de permisos denominado "ASP.Net".

    <PermissionSet
        class="NamedPermissionSet"
        version="1"
        Name="ASP.Net">
      ...
         <IPermission
              class="EventLogPermission"
              version="1">
            <Machine name="."
            access="Write"/>
         </IPermission>
         ...
       </PermissionSet>
    

Nota

En el momento de redactar este artículo, debe establecer access="administer" para poder escribir en el registro de sucesos desde una aplicación de confianza parcial.

Creación de orígenes de sucesos

Si la aplicación necesita crear orígenes de sucesos, tendrá que asegurarse de que la identidad de la aplicación tiene los permisos adecuados en la siguiente clave del Registro:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog

Como mínimo, la identidad del proceso de la aplicación Web, que de manera predeterminada es Servicio de red en el sistema operativo Microsoft Windows Server 2003, deberá tener los siguientes permisos en esta clave del Registro:

  • Consultar valor de la clave

  • Fijar el valor de la clave

  • Crear subclave

  • Enumerar subclaves

  • Notificar

  • Leer

Estos valores de configuración han de aplicarse a la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog y a las subclaves. De manera alternativa, puede crear orígenes de sucesos en el momento de la instalación, cuando están disponibles los privilegios administrativos

Nota

Al habilitar el acceso al registro de sucesos de Windows, se corre el riesgo de que otra aplicación tenga acceso al mismo registro e interfiera con los eventos para, por ejemplo, cubrir las huellas de un usuario mal intencionado

FileIOPermission

Si necesita permitir que la aplicación tenga acceso a archivos externos fuera de la jerarquía de directorios virtuales de la aplicación, podrá crear un archivo de directiva personalizado basado en el archivo de nivel de confianza medio y, a continuación, modificar el permiso FileIOPermission.

Por ejemplo, la siguiente definición permite que una aplicación lea archivos del directorio "C:\SomeDir".

<IPermission
  class="FileIOPermission"
  version="1"
  Read="C:\SomeDir;$AppDir$"
  Write="$AppDir$"
  Append="$AppDir$"
  PathDiscovery="$AppDir$"
/>

Al permitir que las aplicaciones tengan acceso a archivos externos a la jerarquía de directorios virtuales de la aplicación, perderá la capacidad de seguridad de acceso al código para ofrecer el aislamiento de aplicaciones. Si tiene varias aplicaciones en un único servidor, tendrá que proteger los recursos, como los archivos con ACL, y utilizar identidades diferentes para cada aplicación.

Desarrollo del nivel de confianza medio

Para facilitar el diseño y el desarrollo de las aplicaciones en el nivel de confianza medio, tenga en cuenta lo siguiente:

  • Identifique los tipos de recursos que la aplicación necesita para tener acceso y las operaciones con privilegios que necesita ejecutar.

    Necesita saber cuáles son los permisos de seguridad de acceso al código que precisa su aplicación. Para obtener más información sobre los requisitos de permisos, consulte los apartados "Resource Access Permissions Summary" (en inglés) y "Privileged Operation Permissions Summary" (en inglés) en How: Use Code Access Security in ASP.NET 2.0 (en inglés).

  • Averigüe los permisos que hay disponibles en el nivel de confianza medio.

    La mejor forma de conocer qué permisos están disponibles es abrir y examinar el archivo web_MediumTrust.config ubicado en la siguiente carpeta: %windir%\Microsoft.NET\Framework\{Versión}\CONFIG.

  • Configure el entorno de desarrollo y el archivo Web.config de la aplicación para el nivel de confianza medio.

    Haga esto al inicio del desarrollo y que de esa forma pueda ver inmediatamente los errores de solicitudes de permiso y los problemas que deben resolverse.

  • En las aplicaciones ya existentes, tenga presente el uso de la herramienta Permcalc.

    Si tiene una aplicación existente que desea que se ejecute con el nivel de confianza medio, considere el uso de la herramienta Permcalc para ayudar a determinar con precisión los permisos que necesita su aplicación. También debe asegurarse de que se estén realizando pruebas exhaustivas para comprobar que todas las rutas de código de la aplicación se han ejecutado. Si comete un error al hacerlo, puede provocar que se produzcan excepciones de seguridad inesperadas en tiempo de ejecución.

El mejor método es utilizar el nivel de confianza antes de comenzar el trabajo de diseño y desarrollo y que todo este trabajo se realice específicamente para este nivel de confianza. Las causas comunes que producen las excepciones de seguridad al cambiar una aplicación existente al nivel de confianza medio son las siguientes:

  • La llamada a un código no administrado.

  • El acceso al Registro.

  • La escritura en el registro de sucesos.

  • La conexión con bases de datos que no sean SQL Server.

  • El acceso a recursos Web en servidores remotos.

  • El acceso al sistema de archivos desde fuera de la jerarquía de directorios virtuales

Recursos adicionales

How To: Use Code Access Security in ASP.NET 2.0 (en inglés)

Comentarios

Si desea enviar comentarios puede utilizar la wikipedia (en inglés) o el correo electrónico:

Nos interesan especialmente sus comentarios sobre los aspectos siguientes:

  • Problemas técnicos relacionados con nuestras recomendaciones

  • Problemas de aprovechamiento y utilidad

Soporte técnico

Los servicios de soporte de Microsoft ofrecen el soporte técnico de los productos y tecnologías de Microsoft a los que se hace referencia en esta guía. Para obtener información sobre soporte, visite el sitio Web de soporte de Microsoft en http://msdn.microsoft.com/security/default.aspx?pull=/isapi/gosupport.asp?Target=/.

Comunidad y grupos de noticias

El soporte técnico de la comunidad se ofrece en los foros y grupos de noticias:

Para sacar el mayor partido de estos foros, busque el grupo de noticias correspondiente a su tecnología o problema. Por ejemplo, si tiene un problema con las características de seguridad de ASP.NET, debería utilizar el foro de seguridad de ASP.NET (ASP.NET Security).

Colaboradores y revisores

  • Colaboradores y revisores externos: Andy Eunson; Chris Ullman, Content Master; David Raphael, Foundstone Professional Services, Rudolph Araujo, Foundstone Professional Services; Manoranjan M. Paul

  • Colaboradores y revisores de PSS y Microsoft Consulting Services: Wade Mascia, Tom Christian, Adam Semel, Nobuyuki Akama, Microsoft Corporation

  • Colaboradores y revisores de Microsoft Product Group: Stefan Schackow, Vikas Malhotra, Microsoft Corporation

  • Colaboradores y revisores de MSDN: Kent Sharkey, Microsoft Corporation

  • Colaboradores y revisores de Microsoft IT: Eric Rachner, Shawn Veney (ACE Team), Microsoft Corporation

  • Equipo de pruebas: Larry Brader, Microsoft Corporation; Nadupalli Venkata Surya Sateesh, Sivanthapatham Shanmugasundaram, Sameer Tarey, Infosys Technologies Ltd.

  • Equipo de edición: Nelly Delgado, Microsoft Corporation; Sharon Smith, Tina Burden McGrayne, Linda Werner & Associates Inc.

  • Dirección de publicación: Sanjeev Garg, Satyam Computer Services

Mostrar:
© 2014 Microsoft