2008-12-02 54 views
8

Tengo una aplicación Web ASP.NET que hace lo siguiente:ASP.NET: System.UnauthorizedAccessException - Acceso a un denegado

  1. lee un archivo de Excel.
  2. El archivo de Excel tendrá una URL de imagen ubicada en ella que apunta a algún lugar en Internet.
  3. El programa lee cada URL de imagen y la almacena en una carpeta temporal en el servidor web.
  4. La aplicación cambia el tamaño (cambia el ancho y el alto) de la imagen.
  5. Finalmente, la aplicación guardará esa imagen en otra carpeta.

    estoy recibiendo la siguiente excepción:

System.NET.WebException: Una excepción ocurrieron durante una solicitud de cliente Web. ---> System.UnauthorizedAccessException: Se deniega el acceso a la ruta '\ abcserver \ target03 \ 3111 \ 35644 \ www.testing.com \ web \ content \ images \ TempStorage \ tempImage.jpg' . en System.IO .__ Error.WinIOError (Int32 errorCode, Cadena maybeFullPath) en System.IO.FileStream.Init (String path, modo FileMode, acceso FileAccess, Int32 derechos, useRights booleanas, cuota de FileShare, Int32 bufferSize , opciones FileOptions, SECURITY_ATTRIBUTES secAttrs, cadena MSGPATH, Boolean bFromProxy) en System.IO.FileStream..ctor (String ruta, modo FileMode, FileAccess acceso) en System.Net.WebClient.DownloadFile (Uri dirección, String fileName) --- Finalizar de la pila de excepción interna trace ---
en ProcessImage.GetFileFromUrl (String imageFileUrl, Cadena newfilename)
en uploadexceldata.UploadExcelData (String nomArchivo)

foreach (DataRow dr in dt.Rows) // Reading each excel row 
      { 

       if (dr[0].ToString() != "") 
       { 
        id= ""; 
        path = ""; 
        manuId = ""; 


        id= dr[0].ToString(); 
        path = dr[1].ToString(); 
        fileNameOnly = iProImg.GetFileNameOnly(path); 
        objDb.openConnection(); 
        strSqlGroupInfo = "select ManufacturerID from manufacturers where id='" + id+ "'"; 

        dTblManu = objDb.BuildDT(strSqlGroupInfo); // To Fill data to Datatable 
        objDb.closeConnection(); 
        if (dTblManu.Rows.Count > 0) 
        { 
         manuId = dTblManu.Rows[0][0].ToString(); 
        } 

        if (manuId != "") 
        { 
         tempUploadPath = "images/TempStorage/"; 
         tempUploadPath = Server.MapPath(tempUploadPath); 
         if (!Directory.Exists(tempUploadPath)) 
         { 
          Directory.CreateDirectory(tempUploadPath); 
         } 
         tempFilePath = tempUploadPath + "\\tempImage.jpg"; 
         tempFilePath = tempFilePath.Replace("/", "\\"); 

         previewPath = Server.MapPath("images/previews/" + manuId); 
         thumbNailPath = Server.MapPath("images/thumbnails/" + manuId); 

         if (!Directory.Exists(previewPath)) 
         { 
          Directory.CreateDirectory(previewPath); 
         } 
         if (!Directory.Exists(thumbNailPath)) 
         { 
          Directory.CreateDirectory(thumbNailPath); 
         } 
         fileNameOnly = "\\preview" + id+ ".jpg"; 
         fileNameOnly = fileNameOnly.Replace("/", "\\"); 
         previewPath = previewPath + fileNameOnly; 
         tempPartialPathP = "images\\previews\\" + manuId + fileNameOnly; 

         fileNameOnly = "\\thumbnail" + id+ ".jpg"; 
         thumbNailPath = thumbNailPath + fileNameOnly; 
         tempPartialPathT = "images\\thumbnails\\" + manuId + fileNameOnly; 


         try 
         { 

          iProImg.GetFileFromUrl(path, tempFilePath); 
          rowCounter++; 
          iProImg.ReSizeImage(tempFilePath, previewPath, previewSize); 
          iProImg.ReSizeImage(previewPath, thumbNailPath, thumbNailSize); 

         } 
         catch (Exception ec) 
         { 

          errorRowCount++; 
          iLog.LogErrorToFile("uploadExcel", ec.ToString(), "path : " + path + ",tempFilePath :" + tempFilePath); 


         } 
         finally 
         { 
          if(File.Exists(tempFilePath)) 
          { 
          File.Delete(tempFilePath); 
          } 
         } 
        } // If manuid!="" 
       } //if (dr[0].ToString() != "") 

¿Alguien tiene alguna sugerencia sobre cómo solucionar este problema excepción?

Respuesta

8

Intente establecer los permisos de acceso en "Control total" para el usuario de .Net desde donde está leyendo/guardando los archivos.

+0

guión para establecer permisos de "control total" para el usuario de .NET? – Kiquenet

+0

Tuve el mismo problema: era mi directorio temporal el que no tenía los permisos adecuados ... – bgmCoder

3

Asegúrese de que la cuenta ASP.NET tenga permiso de lectura/escritura en la carpeta en la que está escribiendo (seguridad básica de Windows).
Cómo: http://www.microsoft.com/windowsxp/using/networking/security/permissions.mspx
(primeros 4 pasos, seleccione las casillas y haga clic en OK)

[EDIT]
Es necesario autenticarse con una cuenta conocida en el servidor remoto. Probablemente le otorgó derechos a la cuenta ASP.NET local en el servidor remoto, lo cual no funcionará porque ese no es el usuario al que accede a la carpeta (desde el servidor web).
[/ EDIT]

+0

Este es un servidor remoto y la carpeta tiene permiso de lectura/escritura completo. Aún no funciona – Shyju

+1

Tiene que autenticarse con un cuenta conocida en el servidor remoto. Probablemente le otorgó derechos a la cuenta ASP.NET local en el servidor remoto, lo cual no funcionará porque ese no es el usuario al que accede a la carpeta (desde el servidor web). –

3

En respuesta a lo que se dijo: "Este es un servidor remoto y la carpeta tiene permiso completo de lectura/escritura no granted.Still de trabajo"

Asegúrese de que el usuario/máquina .Net el usuario de la cuenta tiene permisos completos para esa Carpeta.

Además, agregue < identidad /> a su archivo de configuración

3

Todo lo anterior, además de que puede ser necesario añadir esta etiqueta:

<identity impersonate="true" userName="accountname" password="password" /> 

Leer este KB article y si se va desde el navegador a iis a un recurso compartido de archivos, que cuenta como dos saltos y ahora necesita configurar la Delegación de Kerberos. Los administradores del sistema mucho más inteligentes que yo han intentado configurar kerberos delegation y han fallado. Mueva sus imágenes o su instancia de IIS para que estén en la misma máquina.

3

En primer lugar, reduzca su problema otorgando temporalmente a Todos permiso total en esa ruta particular. Si funciona, entonces sabrá con certeza que se trata de un simple problema de permiso y solo necesita averiguar qué acción necesita el permiso correspondiente. Probablemente la cuenta de usuario anónimo (compruebe dos veces esta configuración en Administrador de IIS) y no la cuenta de ASP.NET. (no olvides obtener permiso para Todos)

Si es necesario, creo que puedes usar FileMon para ver qué cuenta está intentando acceder a un archivo en particular. Podría estar equivocado, no he usado esta herramienta por un tiempo.

Una última cosa ... es el indicador de solo lectura establecido en el archivo? :)

1

Compruebe que el archivo de imagen (jpg) que está escribiendo en tempStorage tenga los permisos adecuados para la cuenta de usuario web (aspnet o iis_wpg). Puede configurar el directorio TempStorage para reemplazar las entradas permisson en todos los objetos secundarios.

  1. Haga clic derecho carpeta TempStorage y seleccione propiedades
  2. Seleccione la pestaña de seguridad (asegurar la lectura correcta/escribir/modificar los permisos en son aquí)
  3. Haga clic en el botón Opciones avanzadas
  4. Marque la segunda casilla - Reemplazar permisos entradas en todos los objetos secundarios con las entradas que se muestran aquí que se aplican a los objetos secundarios.

Ahora todos los archivos que agregue a la carpeta TempStoreage heredarán los permisos que le permiten a su cuenta webuser leer el archivo jpg.

3

Hoy tuve exactamente el mismo problema. Después de pasar horas intentando rastrear lo que estaba causando el problema, descubrí que los permisos para la carpeta en la que se escribía eran incorrectos. Esencialmente, la carpeta era de solo lectura desde la perspectiva del usuario que se utiliza para crear el archivo.

trate de hacer lo siguiente para la carpeta en cuestión:

  1. clic derecho sobre la carpeta y seleccione Propiedades
  2. Haga clic en la ficha Compartir y haga clic en el botón Permisos
  3. Asegúrese de añadir cualquier usuario va a escribir en la carpeta permisos para hacerlo
  4. De vuelta en la página de propiedades, haga clic en la pestaña Seguridad
  5. Asegúrese de agregar lo que el usuario va a escribir en t los permisos de la carpeta para hacerlo

En vista de que esta pregunta fue hecha hace 6 meses, supongo que ya ha resuelto el problema ... pero pensé que documentaría mi solución por si acaso se vuelve útil para otra persona en el futuro mientras intentan descubrir cómo resolver esta excepción de acceso no autorizado.

4

No hay respuestas en el mundo resolvieron este para mí hasta que me encontré con la respuesta por mí mismo:

ONU-cifrar el archivo

Puede conceder permisos completos para todo el mundo en todo el disco duro, aún no permitirá descifrar archivos de ASP.NET.

Si está seguro de que el archivo no está encriptado, solo necesita agregar la cuenta de ASPNET al archivo o la carpeta a la que desea acceder. ¡Pero asegúrese de que no esté encriptado primero!

+1

Pasé horas probando cada solución en Google. ¡FUERON CIFRADOS! ¡¡¡¡Gracias!!!! (Haga clic derecho-> propiedades-> botón Avanzado al lado de los atributos -> desmarcar encriptar) –

1

En lugar de otorgar permisos al usuario de ASPNET, otorgue permisos al usuario de SERVICIO DE RED. Modificar los permisos de la carpeta debería ser suficiente, sin necesidad de dar permisos completos (no hay razón para dar más permisos que los necesarios)

para más detalles leer el foro: http://forums.asp.net/t/1013434.aspx/1

0

el error es bastante obvio que hay acceso a la ruta 'bin \ myprojname.pdb \' es denegado. el usuario con el que se ejecuta el proceso de la consola web (no el usuario que creó en la consola web, el usuario real de Windows), lo más probable es que el "Servicio de red" no tenga permisos para esa carpeta.

Puede - Haga clic derecho sobre esa carpeta, permisos Goto y agregar el usuario "Servicio de red" - Haga clic derecho sobre esa carpeta, permisos Goto y agregar el usuario "Todos"

que debe solucionar ese problema.

Cuestiones relacionadas